Move lua{intf,playlist,meta} to lua/{intf,playlist,meta}. I haven't been able to...
authorAntoine Cellerier <dionoea@videolan.org>
Wed, 2 Apr 2008 20:32:33 +0000 (22:32 +0200)
committerAntoine Cellerier <dionoea@videolan.org>
Wed, 2 Apr 2008 20:32:33 +0000 (22:32 +0200)
55 files changed:
Makefile.am
NEWS
modules/misc/lua/intf.c
modules/misc/lua/meta.c
modules/misc/lua/playlist.c
modules/misc/lua/vlc.c
share/Makefile.am
share/lua/intf/dummy.lua [new file with mode: 0644]
share/lua/intf/hotkeys.lua [new file with mode: 0644]
share/lua/intf/http.lua [new file with mode: 0644]
share/lua/intf/modules/acl.lua [new file with mode: 0644]
share/lua/intf/modules/common.lua [new file with mode: 0644]
share/lua/intf/modules/host.lua [new file with mode: 0644]
share/lua/intf/modules/httpd.lua [new file with mode: 0644]
share/lua/intf/modules/sandbox.lua [new file with mode: 0644]
share/lua/intf/rc.lua [new file with mode: 0644]
share/lua/intf/telnet.lua [new file with mode: 0644]
share/lua/meta/README.txt [new file with mode: 0644]
share/lua/meta/googleimage.lua [new file with mode: 0644]
share/lua/playlist/README.txt [new file with mode: 0644]
share/lua/playlist/appletrailers.lua [new file with mode: 0644]
share/lua/playlist/break.lua [new file with mode: 0644]
share/lua/playlist/canalplus.lua [new file with mode: 0644]
share/lua/playlist/dailymotion.lua [new file with mode: 0644]
share/lua/playlist/googlevideo.lua [new file with mode: 0644]
share/lua/playlist/joox.lua [new file with mode: 0644]
share/lua/playlist/lelombrik.lua [new file with mode: 0644]
share/lua/playlist/megavideo.lua [new file with mode: 0644]
share/lua/playlist/metacafe.lua [new file with mode: 0644]
share/lua/playlist/youtube.lua [new file with mode: 0644]
share/lua/playlist/youtube_homepage.lua [new file with mode: 0644]
share/luaintf/dummy.lua [deleted file]
share/luaintf/hotkeys.lua [deleted file]
share/luaintf/http.lua [deleted file]
share/luaintf/modules/acl.lua [deleted file]
share/luaintf/modules/common.lua [deleted file]
share/luaintf/modules/host.lua [deleted file]
share/luaintf/modules/httpd.lua [deleted file]
share/luaintf/modules/sandbox.lua [deleted file]
share/luaintf/rc.lua [deleted file]
share/luaintf/telnet.lua [deleted file]
share/luameta/README.txt [deleted file]
share/luameta/googleimage.lua [deleted file]
share/luaplaylist/README.txt [deleted file]
share/luaplaylist/appletrailers.lua [deleted file]
share/luaplaylist/break.lua [deleted file]
share/luaplaylist/canalplus.lua [deleted file]
share/luaplaylist/dailymotion.lua [deleted file]
share/luaplaylist/googlevideo.lua [deleted file]
share/luaplaylist/joox.lua [deleted file]
share/luaplaylist/lelombrik.lua [deleted file]
share/luaplaylist/megavideo.lua [deleted file]
share/luaplaylist/metacafe.lua [deleted file]
share/luaplaylist/youtube.lua [deleted file]
share/luaplaylist/youtube_homepage.lua [deleted file]

index 62b768b..d5fa568 100644 (file)
@@ -424,21 +424,21 @@ VLC-release.app: vlc
          for i in $(srcdir)/src/.libs/*.dylib ; do \
            $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/lib/`basename $${i}` ; \
          done ;
-       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaplaylist
-       for i in $(srcdir)/share/luaplaylist/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaplaylist/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/playlist
+       for i in $(srcdir)/share/lua/playlist/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/playlist/`basename $${i}` ; \
        done ; \
-       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/luameta
-       for i in $(srcdir)/share/luameta/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/luameta/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/meta
+       for i in $(srcdir)/share/lua/meta/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/meta/`basename $${i}` ; \
        done ; \
-       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaintf
-       for i in $(srcdir)/share/luaintf/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaintf/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/intf
+       for i in $(srcdir)/share/lua/intf/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/intf/`basename $${i}` ; \
        done ; \
-       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaintf/modules
-       for i in $(srcdir)/share/luaintf/modules/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/luaintf/modules/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/intf/modules
+       for i in $(srcdir)/share/lua/intf/modules/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/VLC-release.app/Contents/MacOS/share/lua/intf/modules/`basename $${i}` ; \
        done ; \
        $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/http-lua/dialogs
        $(INSTALL) -d $(top_builddir)/VLC-release.app/Contents/MacOS/share/http-lua/js
@@ -779,21 +779,21 @@ package-win32-base-debug: package-win-common
          cp $$i $(top_builddir)/vlc-$(VERSION)/skins/ || true ; \
        done
 
-       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/luaplaylist
-       for i in $(srcdir)/share/luaplaylist/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/luaplaylist/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/lua/playlist
+       for i in $(srcdir)/share/lua/playlist/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/lua/playlist/`basename $${i}` ; \
        done ;
-       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/luameta
-       for i in $(srcdir)/share/luameta/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/luameta/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/lua/meta
+       for i in $(srcdir)/share/lua/meta/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/lua/meta/`basename $${i}` ; \
        done ;
-       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/luaintf
-       for i in $(srcdir)/share/luaintf/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/luaintf/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/lua/intf
+       for i in $(srcdir)/share/lua/intf/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/lua/intf/`basename $${i}` ; \
        done ;
-       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/luaintf/modules
-       for i in $(srcdir)/share/luaintf/modules/*.* ; do \
-         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/luaintf/modules/`basename $${i}` ; \
+       $(INSTALL) -d $(top_builddir)/vlc-$(VERSION)/share/lua/intf/modules
+       for i in $(srcdir)/share/lua/intf/modules/*.* ; do \
+         $(INSTALL) -m 644 $${i} $(top_builddir)/vlc-$(VERSION)/share/lua/intf/modules/`basename $${i}` ; \
        done ;
 
        mkdir -p "$(top_builddir)/vlc-$(VERSION)/osdmenu"
diff --git a/NEWS b/NEWS
index 2555388..3b70d2c 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -49,10 +49,10 @@ Playlist:
     * Shoutcast TV listings
     * Audioscrobbler/last.fm support
  * Album art support
- * User definable Lua playlist scripts. See share/luaplaylist/README.txt
+ * User definable Lua playlist scripts. See share/lua/playlist/README.txt
    (Default scripts open YouTube, DailyMotion, metacafe and Google Video URLs)
  * User definable Lua metadata and album art fetcher scripts. See
-   share/luameta/README.txt
+   share/lua/meta/README.txt
 
 Input/Demuxers:
   * UDP-Lite transport for RTP/AVP
index 2f63a9f..ceb26f4 100644 (file)
@@ -914,7 +914,7 @@ static char *FindFile( intf_thread_t *p_intf, const char *psz_name )
 {
     char  *ppsz_dir_list[] = { NULL, NULL, NULL, NULL };
     char **ppsz_dir;
-    vlclua_dir_list( VLC_OBJECT(p_intf), "luaintf", ppsz_dir_list );
+    vlclua_dir_list( VLC_OBJECT(p_intf), "intf", ppsz_dir_list );
     for( ppsz_dir = ppsz_dir_list; *ppsz_dir; ppsz_dir++ )
     {
         char *psz_filename;
index e7a1ca6..704a8cb 100644 (file)
@@ -287,7 +287,7 @@ int E_(FindMeta)( vlc_object_t *p_this )
     input_item_t *p_item = p_me->p_item;
     lua_State *L = vlclua_meta_init( p_this, p_item );
 
-    int i_ret = vlclua_scripts_batch_execute( p_this, "luameta", &fetch_meta, L, p_item );
+    int i_ret = vlclua_scripts_batch_execute( p_this, "meta", &fetch_meta, L, p_item );
     lua_close( L );
     return i_ret;
 }
@@ -301,7 +301,7 @@ int E_(FindArt)( vlc_object_t *p_this )
     input_item_t *p_item = (input_item_t *)(p_playlist->p_private);
     lua_State *L = vlclua_meta_init( p_this, p_item );
 
-    int i_ret = vlclua_scripts_batch_execute( p_this, "luameta", &fetch_art, L, p_item );
+    int i_ret = vlclua_scripts_batch_execute( p_this, "meta", &fetch_art, L, p_item );
     lua_close( L );
     return i_ret;
 }
index 7a98733..0a793ce 100644 (file)
@@ -224,7 +224,7 @@ int E_(Import_LuaPlaylist)( vlc_object_t *p_this )
 
     lua_pop( L, 1 );
 
-    ret = vlclua_scripts_batch_execute( p_this, "luaplaylist",
+    ret = vlclua_scripts_batch_execute( p_this, "playlist",
                                         &probe_luascript, L, NULL );
     if( ret )
         E_(Close_LuaPlaylist)( p_this );
index ff712c8..4a7e6e7 100644 (file)
@@ -405,24 +405,24 @@ static int file_compare( const char **a, const char **b )
 int vlclua_dir_list( vlc_object_t *p_this, const char *luadirname,
                      char **ppsz_dir_list )
 {
-    if( asprintf( &ppsz_dir_list[0], "%s" DIR_SEP "%s",
+    if( asprintf( &ppsz_dir_list[0], "%s" DIR_SEP "lua" DIR_SEP "%s",
                    p_this->p_libvlc->psz_datadir, luadirname ) < 0 )
         return VLC_ENOMEM;
 
 #   if defined(__APPLE__) || defined(SYS_BEOS) || defined(WIN32)
     {
         const char *psz_vlcpath = config_GetDataDir();
-        if( asprintf( &ppsz_dir_list[1], "%s" DIR_SEP "%s",
+        if( asprintf( &ppsz_dir_list[1], "%s" DIR_SEP "lua" DIR_SEP "%s",
                       psz_vlcpath, luadirname )  < 0 )
             return VLC_ENOMEM;
 
-        if( asprintf( &ppsz_dir_list[2], "%s" DIR_SEP "share" DIR_SEP "%s",
+        if( asprintf( &ppsz_dir_list[2], "%s" DIR_SEP "share" DIR_SEP "lua" DIR_SEP "%s",
                       psz_vlcpath, luadirname )  < 0 )
             return VLC_ENOMEM;
     }
 #   else
     if( asprintf( &ppsz_dir_list[1],
-                  "share" DIR_SEP "%s", luadirname ) < 0 )
+                  "share" DIR_SEP "lua" DIR_SEP "%s", luadirname ) < 0 )
         return VLC_ENOMEM;
 
 #   ifdef HAVE_SYS_STAT_H
@@ -432,7 +432,7 @@ int vlclua_dir_list( vlc_object_t *p_this, const char *luadirname,
             || !S_ISDIR( stat_info.st_mode ) )
         {
             free(ppsz_dir_list[1]);
-            if( asprintf( &ppsz_dir_list[1], "%s" DIR_SEP "%s",
+            if( asprintf( &ppsz_dir_list[1], "%s" DIR_SEP "lua" DIR_SEP "%s",
                           config_GetDataDir (), luadirname ) < 0 )
                 return VLC_ENOMEM;
         }
index 8cb1a06..5d69a94 100644 (file)
@@ -249,29 +249,29 @@ DIST_osdmenu_minimal = \
        osdmenu/minimal/fs_panel_mockup.png
 
 DIST_lua= \
-       luameta/README.txt \
-       luameta/googleimage.lua \
-       luaplaylist/README.txt \
-       luaplaylist/appletrailers.lua \
-       luaplaylist/break.lua \
-       luaplaylist/dailymotion.lua \
-       luaplaylist/joox.lua \
-       luaplaylist/lelombrik.lua \
-       luaplaylist/youtube.lua \
-       luaplaylist/youtube_homepage.lua \
-       luaplaylist/megavideo.lua \
-       luaplaylist/metacafe.lua \
-       luaplaylist/googlevideo.lua \
-       luaintf/http.lua \
-       luaintf/rc.lua \
-       luaintf/hotkeys.lua \
-       luaintf/modules/common.lua \
-       luaintf/modules/host.lua \
-       luaintf/modules/httpd.lua \
-       luaintf/modules/acl.lua \
-       luaintf/modules/sandbox.lua \
-       luaintf/telnet.lua \
-       luaintf/dummy.lua
+       lua/meta/README.txt \
+       lua/meta/googleimage.lua \
+       lua/playlist/README.txt \
+       lua/playlist/appletrailers.lua \
+       lua/playlist/break.lua \
+       lua/playlist/dailymotion.lua \
+       lua/playlist/joox.lua \
+       lua/playlist/lelombrik.lua \
+       lua/playlist/youtube.lua \
+       lua/playlist/youtube_homepage.lua \
+       lua/playlist/megavideo.lua \
+       lua/playlist/metacafe.lua \
+       lua/playlist/googlevideo.lua \
+       lua/intf/http.lua \
+       lua/intf/rc.lua \
+       lua/intf/hotkeys.lua \
+       lua/intf/modules/common.lua \
+       lua/intf/modules/host.lua \
+       lua/intf/modules/httpd.lua \
+       lua/intf/modules/acl.lua \
+       lua/intf/modules/sandbox.lua \
+       lua/intf/telnet.lua \
+       lua/intf/dummy.lua
 
 DIST_http_lua = \
        http-lua/.hosts \
diff --git a/share/lua/intf/dummy.lua b/share/lua/intf/dummy.lua
new file mode 100644 (file)
index 0000000..7193043
--- /dev/null
@@ -0,0 +1,12 @@
+--[[ This code is public domain (since it really isn't very interesting) ]]--
+
+msg = [[
+This is the `dummy' VLC Lua interface module.
+Please specify a VLC Lua interface to load with the --lua-intf option.
+VLC Lua interface modules include: `rc', `telnet' and `hotkeys'.
+For example: vlc -I lua --lua-intf rc]]
+--You can also use the alternate syntax: vlc -I "lua{intf=rc}"]]
+
+for line in string.gmatch(msg,"([^\n]+)\n*") do
+    vlc.msg.err(line)
+end
diff --git a/share/lua/intf/hotkeys.lua b/share/lua/intf/hotkeys.lua
new file mode 100644 (file)
index 0000000..0b01cec
--- /dev/null
@@ -0,0 +1,119 @@
+--[==========================================================================[
+ hotkeys.lua: hotkey handling for VLC
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+--[==========================================================================[
+    This is meant to replace modules/control/hotkeys.c
+    (which will require some changes in the VLC core hotkeys stuff)
+--]==========================================================================]
+
+require("common")
+--common.table_print(vlc,"vlc.\t")
+
+bindings = {
+    ["Ctrl-q"] = "quit",
+    ["Space"] = "play-pause",
+    [113] --[[q]] = "quit",
+    [119] --[[w]] = "demo",
+    [120] --[[x]] = "demo2",
+    }
+
+function quit()
+    print("Bye-bye!")
+    vlc.quit()
+end
+
+function demo()
+    vlc.osd.icon("speaker")
+end
+
+function demo2()
+    if not channel1 then
+        channel1 = vlc.osd.channel_register()
+        channel2 = vlc.osd.channel_register()
+    end
+    vlc.osd.message("Hey!",channel1)
+    vlc.osd.slider( 10, "horizontal", channel2 )
+end
+
+function action(func,delta)
+    return { func = func, delta = delta or 0, last = 0, times = 0 }
+end
+
+actions = {
+    ["quit"] = action(quit),
+    ["play-pause"] = action(play_pause),
+    ["demo"] = action(demo),
+    ["demo2"] = action(demo2),
+    }
+
+action = nil
+
+queue = {}
+
+function action_trigger( action )
+    print("action_trigger:",tostring(action))
+    local a = actions[action]
+    if a then
+        local date = vlc.mdate()
+        if a.delta and date > a.last + a.delta then
+            a.times = 0
+        else
+            a.times = a.times + 1
+        end
+        a.last = date
+        table.insert(queue,action)
+        vlc.signal()
+    else
+        vlc.msg_err("Key `"..key.."' points to unknown action `"..bindings[key].."'.")
+    end
+end
+
+function key_press( var, old, new, data )
+    local key = new
+    print("key_press:",tostring(key))
+    if bindings[key] then
+        action_trigger(bindings[key])
+    else
+        vlc.msg_err("Key `"..key.."' isn't bound to any action.")
+    end
+end
+
+vlc.var.add_callback( vlc.object.libvlc(), "key-pressed", key_press )
+--vlc.var.add_callback( vlc.object.libvlc(), "action-triggered", action_trigger )
+
+while not die do
+    if #queue ~= 0 then
+        local action = actions[queue[1]]
+        local ok, msg = pcall( action.func )
+        if not ok then
+            vlc.msg.err("Error while executing action `"..queue[1].."': "..msg)
+        end
+        table.remove(queue,1)
+    else
+        die = vlc.lock_and_wait()
+    end
+end
+
+-- Clean up
+vlc.var.del_callback( vlc.object.libvlc(), "key-pressed", key_press )
+--vlc.var.del_callback( vlc.object.libvlc(), "action-triggered", action_trigger )
diff --git a/share/lua/intf/http.lua b/share/lua/intf/http.lua
new file mode 100644 (file)
index 0000000..1e6d775
--- /dev/null
@@ -0,0 +1,275 @@
+--[==========================================================================[
+ http.lua: HTTP interface module for VLC
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+--[==========================================================================[
+Configuration options:
+ * host: A host to listen on.
+ * dir: Directory to use a the http interface's root.
+ * no_error_detail: If set, do not print the Lua error message when generating
+                    a page fails.
+ * no_index: If set, don't build directory indexes
+--]==========================================================================]
+
+
+require "httpd"
+require "acl"
+require "common"
+
+vlc.msg.err("Lua HTTP interface")
+
+open_tag = "<?vlc"
+close_tag = "?>"
+
+function escape(s)
+    return (string.gsub(s,"([%^%$%%%.%[%]%*%+%-%?])","%%%1"))
+end
+
+function process_raw(filename)
+    local input = io.open(filename):read("*a")
+    -- find the longest [===[ or ]=====] type sequence and make sure that
+    -- we use one that's longer.
+    local str="X"
+    for str2 in string.gmatch(input,"[%[%]]=*[%[%]]") do
+        if #str < #str2 then str = str2 end
+    end
+    str=string.rep("=",#str-1)
+
+    --[[ FIXME:
+    <?xml version="1.0" encoding="charset" standalone="yes" ?> is still a problem. The closing '?>' needs to be printed using '?<?vlc print ">" ?>' to prevent a parse error.
+    --]]
+    local code0 = string.gsub(input,escape(close_tag)," print(["..str.."[")
+    local code1 = string.gsub(code0,escape(open_tag),"]"..str.."]) ")
+    local code = "print(["..str.."["..code1.."]"..str.."])"
+    --[[ Uncomment to debug
+    if string.match(filename,"vlm_cmd.xml$") then
+    io.write(code)
+    io.write("\n")
+    end
+    --]]
+    return assert(loadstring(code,filename))
+end
+function process(filename)
+    vlc.msg.dbg("Loading `"..filename.."'")
+    local mtime = 0 -- vlc.fd.stat(filename).modification_time
+    local func = false -- process_raw(filename)
+    return function(...)
+        local new_mtime = vlc.fd.stat(filename).modification_time
+        if new_mtime ~= mtime then
+            -- Re-read the file if it changed
+            vlc.msg.dbg("Reloading `"..filename.."'")
+            func = process_raw(filename)
+            mtime = new_mtime
+        end
+        return func(...)
+    end
+end
+
+
+function callback_error(path,url,msg)
+    local url = url or "&lt;page unknown&gt;"
+    return  [[<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Error loading ]]..url..[[</title>
+</head>
+<body>
+<h1>Error loading ]]..url..[[</h1><pre>]]..(config.no_error_detail and "Remove configuration option `no_error_detail' on the server to get more information." or tostring(msg))..[[</pre>
+<p>
+<a href="http://www.videolan.org/">VideoLAN</a><br/>
+<a href="http://www.lua.org/manual/5.1/">Lua 5.1 Reference Manual</a>
+</p>
+</body>
+</html>]]
+end
+
+function dirlisting(url,listing)
+    local list = {}
+    for _,f in ipairs(listing) do
+        if not string.match(f,"^%.") then
+            table.insert(list,"<li><a href='"..f.."'>"..f.."</a></li>")
+        end
+    end
+    list = table.concat(list)
+    local function callback()
+        return [[<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<title>Directory listing ]]..url..[[</title>
+</head>
+<body>
+<h1>Directory listing ]]..url..[[</h1><ul>]]..list..[[</ul>
+</body>
+</html>]]
+    end
+    return h:file_new(url,"text/html",nil,nil,nil,callback,nil)
+end
+
+function file(h,path,url,acl_,mime)
+    local generate_page = process(path)
+    local callback = function(data,request)
+        -- FIXME: I'm sure that we could define a real sandbox
+        -- redefine print
+        local page = {}
+        local function pageprint(...)
+            for i=1,select("#",...) do
+                if i== 1 then
+                    table.insert(page,tostring(select(i,...)))
+                else
+                    table.insert(page," "..tostring(select(i,...)))
+                end
+            end
+        end
+        _G._GET = parse_url_request(request)
+        local oldprint = print
+        print = pageprint
+        local ok, msg = pcall(generate_page)
+        -- reset
+        print = oldprint
+        if not ok then
+            return callback_error(path,url,msg)
+        end
+        return table.concat(page)
+    end
+    return h:file_new(url or path,mime,nil,nil,acl_,callback,nil)
+end
+
+function rawfile(h,path,url,acl_)
+    local filename = path
+    vlc.msg.dbg("Loading `"..filename.."'")
+    local mtime = 0 -- vlc.fd.stat(filename).modification_time
+    local page = false -- io.open(filename):read("*a")
+    local callback = function(data,request)
+        local new_mtime = vlc.fd.stat(filename).modification_time
+        if mtime ~= new_mtime then
+            -- Re-read the file if it changed
+            vlc.msg.dbg("Reloading `"..filename.."'")
+            page = io.open(filename):read("*a")
+            mtime = new_mtime
+        end
+        return page
+    end
+    return h:file_new(url or path,nil,nil,nil,acl_,callback,nil)
+end
+
+function parse_url_request(request)
+    if not request then return {} end
+    t = {}
+    for k,v in string.gmatch(request,"([^=&]+)=?([^=&]*)") do
+        local k_ = vlc.decode_uri(k)
+        local v_ = vlc.decode_uri(v)
+        t[k_]=v_
+    end
+    return t
+end
+
+local function find_datadir(name)
+    local list = vlc.datadir_list(name)
+    for _, l in ipairs(list) do
+        local s = vlc.fd.stat(l)
+        if s then
+            return l
+        end
+    end
+    error("Unable to find the `"..name.."' directory.")
+end
+http_dir = config.dir or find_datadir("http-lua")
+
+do
+    local oldpath = package.path
+    package.path = http_dir.."/?.lua"
+    local ok, err = pcall(require,"custom")
+    if not ok then
+        vlc.msg.warn("Couldn't load "..http_dir.."/custom.lua")
+    else
+        vlc.msg.dbg("Loaded "..http_dir.."/custom.lua")
+    end
+    package.path = oldpath
+end
+local files = {}
+local mimes = {
+    txt = "text/plain",
+    html = "text/html",
+    xml = "text/xml",
+    js = "text/javascript",
+    png = "image/png",
+    ico = "image/x-icon",
+}
+local function load_dir(dir,root,parent_acl)
+    local root = root or "/"
+    local has_index = false
+    if string.match(dir,"/old") then
+        return
+    end
+    local my_acl = parent_acl
+    do
+        local af = dir.."/.hosts"
+        local s = vlc.fd.stat(af)
+        if s and s.type == "file" then
+            -- We found an acl
+            my_acl = acl.new(false)
+            my_acl:load_file(af)
+        end
+    end
+    local d = vlc.fd.opendir(dir)
+    for _,f in ipairs(d) do
+        if not string.match(f,"^%.") then
+            local s = vlc.fd.stat(dir.."/"..f)
+            if s.type == "file" then
+                local url
+                if f == "index.html" then
+                    url = root
+                    has_index = true
+                else
+                    url = root..f
+                end
+                local ext = string.match(f,"%.([^%.]-)$")
+                local mime = mimes[ext]
+                -- print(url,mime)
+                if mime and string.match(mime,"^text/") then
+                    table.insert(files,file(h,dir.."/"..f,url,my_acl and my_acl.private,mime))
+                else
+                    table.insert(files,rawfile(h,dir.."/"..f,url,my_acl and my_acl.private))
+                end
+            elseif s.type == "dir" then
+                if f == "dialogs" then -- FIXME
+                else
+                    load_dir(dir.."/"..f,root..f.."/",my_acl)
+                end
+            end
+        end
+    end
+    if not has_index and not config.no_index then
+        -- print("Adding index for", root)
+        table.insert(files,dirlisting(root,d,my_acl and my_acl.private))
+    end
+end
+
+local u = vlc.net.url_parse( config.host or "localhost:8080" )
+h = httpd.new(u.host,u.port)
+load_dir( http_dir )
+
+while not die do die = vlc.lock_and_wait() end -- everything happens in callbacks
+
+-- FIXME: We shouldn't need to do this ourselves.
+for i=1,#files do
+    getmetatable(files[i]).__gc(files[i])
+    files[i] = nil
+end
diff --git a/share/lua/intf/modules/acl.lua b/share/lua/intf/modules/acl.lua
new file mode 100644 (file)
index 0000000..d93f546
--- /dev/null
@@ -0,0 +1,81 @@
+--[==========================================================================[
+ acl.lua: VLC Lua interface ACL object
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+--[==========================================================================[
+require "acl"
+local a = acl.new(true) -> new ACL with default set to allow
+a:check("10.0.0.1") -> 0 == allow, 1 == deny, -1 == error
+a("10.0.0.1") -> same as a:check("10.0.0.1")
+a:duplicate() -> duplicate ACL object
+a:add_host("10.0.0.1",true) -> allow 10.0.0.1
+a:add_net("10.0.0.0",24,true) -> allow 10.0.0.0/24 (not sure)
+a:load_file("/path/to/acl") -> load ACL from file
+--]==========================================================================]
+
+module("acl",package.seeall)
+
+methods = {
+    check = function(this,ip)
+        return vlc.acl.check(this.private,ip)
+    end,
+    duplicate = function(this)
+        return setmetatable({ private = vlc.acl.duplicate( rawget(this,"private") ) },metatable)
+    end,
+    add_host = function(this,ip,allow)
+        return vlc.acl.add_host(this.private,ip,allow)
+    end,
+    add_net = function(this,ip,len,allow)
+        return vlc.acl.add_net(this.private,ip,len,allow)
+    end,
+    load_file = function(this,path)
+        return vlc.acl.load_file(this.private,path)
+    end,
+}
+
+metatable = {
+    __index = function(this,key)
+        if methods[key] then
+            return methods[key]
+        elseif key == "private" then
+            error("Forbidden")
+        else
+            return rawget(this,key)
+        end
+    end,
+    __newindex = function(this,key,value)
+        if key == "private" or methods[key] then
+            error("Forbidden")
+        else
+            rawset(this,key,value)
+        end
+    end,
+    __call = methods.check,
+    __gc = function(this)
+        vlc.acl.delete(this.private)
+    end,
+    __metatable = "None of your business.",
+}
+
+function new( allow )
+    return setmetatable({ private = vlc.acl.create( allow ) },metatable)
+end
diff --git a/share/lua/intf/modules/common.lua b/share/lua/intf/modules/common.lua
new file mode 100644 (file)
index 0000000..f0a1aa2
--- /dev/null
@@ -0,0 +1,87 @@
+--[[ This code is public domain (since it really isn't very interesting) ]]--
+
+module("common",package.seeall)
+
+-- Iterate over a table in the keys' alphabetical order
+function pairs_sorted(t)
+    local s = {}
+    for k,_ in pairs(t) do table.insert(s,k) end
+    table.sort(s)
+    local i = 0
+    return function () i = i + 1; return s[i], t[s[i]] end
+end
+
+-- Return a function such as skip(foo)(a,b,c) = foo(b,c)
+function skip(foo)
+    return function(discard,...) return foo(...) end
+end
+
+-- Return a function such as setarg(foo,a)(b,c) = foo(a,b,c)
+function setarg(foo,a)
+    return function(...) return foo(a,...) end
+end
+
+-- Trigger a hotkey
+function hotkey(arg)
+    vlc.var.set( vlc.object.libvlc(), "key-pressed", vlc.config.get( arg ) )
+end
+
+-- Take a video snapshot
+function snapshot()
+    local vout = vlc.object.find(nil,"vout","anywhere")
+    if not vout then return end
+    vlc.var.set(vout,"video-snapshot",nil)
+end
+
+-- Naive (non recursive) table copy
+function table_copy(t)
+    c = {}
+    for i,v in pairs(t) do c[i]=v end
+    return c
+end
+
+-- strip leading and trailing spaces
+function strip(str)
+    return string.gsub(str, "^%s*(.-)%s*$", "%1")
+end
+
+-- print a table (recursively)
+function table_print(t,prefix)
+    local prefix = prefix or ""
+    for a,b in pairs_sorted(t) do
+        print(prefix..tostring(a),b)
+        if type(b)==type({}) then
+            table_print(b,prefix.."\t")
+        end
+    end
+end
+
+-- print the list of callbacks registered in lua
+-- usefull for debug purposes
+function print_callbacks()
+    print "callbacks:"
+    table_print(vlc.callbacks)
+end 
+
+-- convert a duration (in seconds) to a string
+function durationtostring(duration)
+    return string.format("%02d:%02d:%02d",
+                         math.floor(duration/3600),
+                         math.floor(duration/60)%60,
+                         math.floor(duration%60))
+end
+
+-- realpath
+function realpath(path)
+    return string.gsub(string.gsub(string.gsub(string.gsub(path,"/%.%./[^/]+","/"),"/[^/]+/%.%./","/"),"/%./","/"),"//","/")
+end
+
+-- seek
+function seek(value)
+    local input = vlc.object.input()
+    if string.sub(value,#value)=="%" then
+        vlc.var.set(input,"position",tonumber(string.sub(value,1,#value-1))/100.)
+    else
+        vlc.var.set(input,"time",tonumber(value))
+    end
+end
diff --git a/share/lua/intf/modules/host.lua b/share/lua/intf/modules/host.lua
new file mode 100644 (file)
index 0000000..4d60ea6
--- /dev/null
@@ -0,0 +1,350 @@
+--[==========================================================================[
+ host.lua: VLC Lua interface command line host module
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+--[==========================================================================[
+Example use:
+
+    require "host"
+    h = host.host()
+
+    -- Bypass any authentification
+    function on_password( client )
+        client:switch_status( host.status.read )
+    end
+    h.status_callbacks[host.status.password] = on_password
+
+    h:listen( "localhost:4212" )
+    h:listen( "*console" )
+    --or h:listen( { "localhost:4212", "*console" } )
+
+    -- The main loop
+    while not vlc.should_die() do
+        -- accept new connections
+        h:accept()
+
+        -- select active clients
+        local write, read = h:select( 0.1 ) -- 0.1 is a timeout in seconds
+
+        -- handle clients in write mode
+        for _, client in pairs(write) do
+            client:send()
+            client.buffer = ""
+            client:switch_status( host.status.read )
+        end
+
+        -- handle clients in read mode
+        for _, client in pairs(read) do
+            local str = client:recv(1000)
+            str = string.gsub(str,"\r?\n$","")
+            client.buffer = "Got `"..str.."'.\r\n"
+            client:switch_status( host.status.write )
+        end
+    end
+
+For complete examples see existing VLC Lua interface modules (ie telnet.lua)
+--]==========================================================================]
+
+module("host",package.seeall)
+
+status = { init = 0, read = 1, write = 2, password = 3 }
+client_type = { net = 1, stdio = 2, fifo = 3 }
+
+function host()
+    -- private data
+    local clients = {}
+    local listeners = {}
+    local status_callbacks = {}
+
+    -- private methods
+    local function new_fd_set()
+        function foo_fds(foo)
+            return function(fd,...) return foo(fd.fds,...) end
+        end
+        return { -- data
+                 fds = vlc.fd.new_fd_set(),
+                 -- methods
+                 zero = foo_fds( vlc.fd.fd_zero ),
+                 set = foo_fds( vlc.fd.fd_set ),
+                 isset = foo_fds( vlc.fd.fd_isset ),
+                 clr = foo_fds( vlc.fd.fd_clr ),
+               }
+    end
+
+    -- private data
+    local fds_read = new_fd_set()
+    local fds_write = new_fd_set()
+
+    -- private methods
+    local function client_accept( clients, listen )
+        local wait
+        if #clients == 0 then
+            wait = -1
+        else
+            wait = 0
+        end
+        return vlc.net.accept( listen, wait )
+    end
+
+    local function fd_client( client )
+        if client.status == status.read then
+            return client.rfd
+        else -- status.write
+            return client.wfd
+        end
+    end
+
+    local function send( client, data, len )
+        if len then
+            return vlc.net.send( client.wfd, data, len )
+        else
+            return vlc.net.send( client.wfd, data or client.buffer )
+        end
+    end
+
+    local function recv( client, len )
+        if len then
+            return vlc.net.recv( client.rfd, len )
+        else
+            return vlc.net.recv( client.rfd )
+        end
+    end
+
+    local function write( client, data )
+        return vlc.fd.write( client.wfd, data or client.buffer )
+    end
+
+    local function read( client, len )
+        if len then
+            return vlc.fd.read( client.rfd, len )
+        else
+            return vlc.fd.read( client.rfd )
+        end
+    end
+
+    local function del_client( client )
+        if client.type == client_type.stdio then
+            client:send( "Cannot delete stdin/stdout client.\n" )
+            return
+        end
+        for i, c in pairs(clients) do
+            if c == client then
+                if client.type == client_type.net then
+                    if client.wfd ~= client.rfd then
+                        vlc.net.close( client.rfd )
+                    end
+                    vlc.net.close( client.wfd )
+                end
+                clients[i] = nil
+                return
+            end
+        end
+        vlc.msg.err("couldn't find client to remove.")
+    end
+    
+    local function switch_status( client, s )
+        if client.status == s then return end
+        client.status = s
+        if status_callbacks[s] then
+            status_callbacks[s]( client )
+        end
+    end
+
+    -- append a line to a client's (output) buffer
+    local function append( client, string )
+        client.buffer = client.buffer .. string .. "\r\n"
+    end
+
+    local function new_client( h, fd, wfd, t )
+        if fd < 0 then return end
+        local w, r
+        if t == client_type.net then
+            w = send
+            r = recv
+        else if t == client_type.stdio or t == client_type.fifo then
+            w = write
+            r = read
+        else
+            error("Unknown client type", t )
+        end end
+        local client = { -- data
+                         rfd = fd,
+                         wfd = wfd or fd,
+                         status = status.init,
+                         buffer = "",
+                         type = t,
+                         -- methods
+                         fd = fd_client,
+                         send = w,
+                         recv = r,
+                         del = del_client,
+                         switch_status = switch_status,
+                         append = append,
+                       }
+        client:send( "VLC media player "..vlc.version().."\n" )
+        table.insert(clients, client)
+        client:switch_status(status.password)
+    end
+
+    function filter_client( fd, status, status2 )
+        local l = 0
+        fd:zero()
+        for _, client in pairs(clients) do
+            if client.status == status or client.status == status2 then
+                fd:set( client:fd() )
+                l = math.max( l, client:fd() )
+            end
+        end
+        return l
+    end
+
+    -- public methods
+    local function _listen_tcp( h, host, port )
+        if listeners.tcp and listeners.tcp[host]
+                         and listeners.tcp[host][port] then
+            error("Already listening on tcp host `"..host..":"..tostring(port).."'")
+        end
+        if not listeners.tcp then
+            listeners.tcp = {}
+        end
+        if not listeners.tcp[host] then
+            listeners.tcp[host] = {}
+        end
+        local listener = vlc.net.listen_tcp( host, port )
+        listeners.tcp[host][port] = listener
+        if not listeners.tcp.list then
+            -- FIXME: if host == "list" we'll have a problem
+            listeners.tcp.list = {}
+            local m = { __mode = "v" } -- week values
+            setmetatable( listeners.tcp.list, m )
+        end
+        table.insert( listeners.tcp.list, listener )
+    end
+
+    local function _listen_stdio( h )
+        
+        if listeners.stdio then
+            error("Already listening on stdio")
+        end
+        new_client( h, 0, 1, client_type.stdio )
+        listeners.stdio = true
+    end
+
+    local function _listen( h, url )
+        if type(url)==type({}) then
+            for _,u in pairs(url) do
+                h:listen( u )
+            end
+        else
+            vlc.msg.info( "Listening on host \""..url.."\"." )
+            if url == "*console" then
+                h:listen_stdio()
+            else
+                u = vlc.net.url_parse( url )
+                h:listen_tcp( u.host, u.port )
+            end
+        end
+    end
+
+    local function _accept( h )
+        if listeners.tcp then
+            local wait
+            if #clients == 0 and not listeners.stdio and #listeners.tcp.list == 1 then
+                wait = -1 -- blocking
+            else
+                wait = 0
+            end
+            for _, listener in pairs(listeners.tcp.list) do
+                local fd = vlc.net.accept( listener, wait )
+                new_client( h, fd, fd, client_type.net )
+            end
+        end
+    end
+
+    local function _select( h, timeout )
+        local nfds = math.max( filter_client( fds_read, status.read, status.password ),
+                               filter_client( fds_write, status.write ) ) + 1
+        local ret = vlc.net.select( nfds, fds_read.fds, fds_write.fds,
+                                    timeout or 0.5 )
+        local wclients = {}
+        local rclients = {}
+        if ret > 0 then
+            for _, client in pairs(clients) do
+                if fds_write:isset( client:fd() ) then
+                    table.insert(wclients,client)
+                end
+                if fds_read:isset( client:fd() ) then
+                    table.insert(rclients,client)
+                end
+            end
+        end
+        return wclients, rclients
+    end
+
+    local function destructor( h )
+        print "destructor"
+        for _,client in pairs(clients) do
+            client:send("Shutting down.")
+            if client.type == client_type.tcp then
+                if client.wfd ~= client.rfd then
+                    vlc.net.close(client.rfd)
+                end
+                vlc.net.close(client.wfd)
+            end
+        end
+
+        if listeners.tcp then
+            for _, listener in pairs(listeners.tcp.list) do
+                vlc.net.listen_close( listener )
+            end
+        end
+    end
+
+    local function _broadcast( h, msg )
+        for _,client in pairs(clients) do
+            client:send( msg )
+        end
+    end
+
+    -- the instance
+    local h = { -- data
+                status_callbacks = status_callbacks,
+                -- methods
+                listen = _listen,
+                listen_tcp = _listen_tcp,
+                listen_stdio = _listen_stdio,
+                accept = _accept,
+                select = _select,
+                broadcast = _broadcast,
+              }
+
+    -- the metatable
+    local m = { -- data
+                __metatable = "Nothing to see here. Move along.",
+                -- methods
+                __gc = destructor,
+              }
+
+    setmetatable( h, m )
+
+    return h
+end
diff --git a/share/lua/intf/modules/httpd.lua b/share/lua/intf/modules/httpd.lua
new file mode 100644 (file)
index 0000000..ff0ecb4
--- /dev/null
@@ -0,0 +1,75 @@
+--[==========================================================================[
+ httpd.lua: VLC Lua interface HTTPd module
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+--[==========================================================================[
+--]==========================================================================]
+
+module("httpd",package.seeall)
+
+local function generic_metatable(methods,destructor)
+    return {
+        __index = function(this,key)
+            if methods and methods[key] then
+                return methods[key]
+            elseif key == "private" then
+                error("Forbidden")
+            else
+                return rawget(this,key)
+            end
+        end,
+        __newindex = function(this,key,value)
+            if key == "private" or (methods and methods[key]) then
+                error("Forbidden")
+            else
+                rawset(this,key,value)
+            end
+        end,
+        __gc = function(this)
+            if destructor then
+                destructor(rawget(this,"private"))
+            end
+        end,
+        --__metatable = "None of your business.",
+    }
+end
+
+local handler_metatable = generic_metatable({},vlc.httpd.handler_delete)
+local file_metatable = generic_metatable({},vlc.httpd.file_delete)
+local redirect_metatable = generic_metatable({},vlc.httpd.redirect_delete)
+
+local host_methods = {
+    handler_new = function(this,...)
+        return setmetatable({private=vlc.httpd.handler_new(rawget(this,"private"),...),parent=this},handler_metatable)
+    end,
+    file_new = function(this,...)
+        return setmetatable({private=vlc.httpd.file_new(rawget(this,"private"),...),parent=this},file_metatable)
+    end,
+    redirect_new = function(this,...)
+        return setmetatable({private=vlc.httpd.redirect_new(rawget(this,"private"),...),parent=this},redirect_metatable)
+    end,
+}
+local host_metatable = generic_metatable(host_methods,vlc.httpd.host_delete)
+
+function new( ... )
+    return setmetatable({private=vlc.httpd.host_new(...)},host_metatable)
+end
diff --git a/share/lua/intf/modules/sandbox.lua b/share/lua/intf/modules/sandbox.lua
new file mode 100644 (file)
index 0000000..c85e483
--- /dev/null
@@ -0,0 +1,120 @@
+--[==========================================================================[
+ sandbox.lua: Lua sandboxing facilities
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+module("sandbox",package.seeall)
+
+-- See Programming in Lua (second edition) for sandbox examples
+-- See http://lua-users.org/wiki/SandBoxes for a list of SAFE/UNSAFE variables
+
+local sandbox_blacklist = {
+    collectgarbage = true,
+    dofile = true,
+    _G = true,
+    getfenv = true,
+    getmetatable = true,
+    load = true, -- Can be protected I guess
+    loadfile = true, -- Can be protected I guess
+    loadstring = true, -- Can be protected I guess
+    rawequal = true,
+    rawget = true,
+    rawset = true,
+    setfenv = true,
+    setmetatable = true,
+    module = true,
+    require = true,
+    package = true,
+    debug = true,
+}
+
+function readonly_table_proxy(name,src,blacklist)
+    if type(src)=="nil" then return end
+    if type(src)~="table" then error("2nd argument must be a table (or nil)") end
+    local name = name
+    local t = src
+    local blist = {}
+    if blacklist then
+        for _, v in pairs(blacklist) do
+            blist[v] = true
+        end
+    end
+    local metatable_readonly = {
+        __index = function(self,key)
+            if blist[key] then
+                error("Sandbox: Access to `"..name.."."..key.."' is forbidden.")
+            end
+            return t[key]
+        end,
+        __newindex = function(self,key,value)
+            error("It is forbidden to modify elements of this table.")
+        end,
+    }
+    return setmetatable({},metatable_readonly)
+end
+
+-- Of course, all of this is useless if the sandbox calling code has
+-- another reference to one of these tables in his global environement.
+local sandbox_proxy = {
+    coroutine   = readonly_table_proxy("coroutine",coroutine),
+    string      = readonly_table_proxy("string",string,{"dump"}),
+    table       = readonly_table_proxy("table",table),
+    math        = readonly_table_proxy("math",math),
+    io          = readonly_table_proxy("io",io),
+    os          = readonly_table_proxy("os",os,{"exit","getenv","remove",
+                                                "rename","setlocale"}),
+    sandbox     = readonly_table_proxy("sandbox",sandbox),
+}
+
+function sandbox(func,override)
+    local _G = getfenv(2)
+    local override = override or {}
+    local sandbox_metatable =
+    {
+        __index = function(self,key)
+            if override[key] then
+                return override[key]
+            end
+            if sandbox_blacklist[key] then
+                error( "Sandbox: Access to `"..key.."' is forbidden." )
+            end
+            --print(key,"not found in env. Looking in sandbox_proxy and _G")
+            local value = sandbox_proxy[key] or _G[key]
+            rawset(self,key,value) -- Keep a local copy
+            return value
+        end,
+        __newindex = function(self,key,value)
+            if override and override[key] then
+                error( "Sandbox: Variable `"..key.."' is read only." )
+            end
+            return rawset(self,key,value)
+        end,
+    }
+    local sandbox_env = setmetatable({},sandbox_metatable)
+    return function(...)
+        setfenv(func,sandbox_env)
+        local ret = {func(...)} -- Not perfect (if func returns nil before
+                                -- another return value) ... but it's better
+                                -- than nothing
+        setfenv(func,_G)
+        return unpack(ret)
+    end
+end
\ No newline at end of file
diff --git a/share/lua/intf/rc.lua b/share/lua/intf/rc.lua
new file mode 100644 (file)
index 0000000..17a6278
--- /dev/null
@@ -0,0 +1,638 @@
+--[==========================================================================[
+ rc.lua: remote control module for VLC
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+description=
+[============================================================================[
+ Remote control interface for VLC
+
+ This is a modules/control/rc.c look alike (with a bunch of new features)
+ Use on local term:
+    vlc -I luarc
+ Use on tcp connection:
+    vlc -I luarc --lua-config "rc={host='localhost:4212'}"
+ Use on multiple hosts (term + 2 tcp ports):
+    vlc -I luarc --lua-config "rc={hosts={'*console','localhost:4212','localhost:5678'}}"
+ Note:
+    -I luarc is an alias for -I lua --lua-intf rc
+
+ Configuration options setable throught the --lua-config option are:
+    * hosts: A list of hosts to listen on.
+    * host: A host to listen on. (won't be used if `hosts' is set)
+ The following can be set using the --lua-config option or in the interface
+ itself using the `set' command:
+    * prompt: The prompt.
+    * welcome: The welcome message.
+    * width: The default terminal width (used to format text).
+    * autocompletion: When issuing an unknown command, print a list of
+                      possible commands to autocomplete with. (0 to disable,
+                      1 to enable).
+    * autoalias: If autocompletion returns only one possibility, use it
+                 (0 to disable, 1 to enable).
+    * flatplaylist: 0 to disable, 1 to enable.
+]============================================================================]
+
+require("common")
+skip = common.skip
+skip2 = function(foo) return skip(skip(foo)) end
+setarg = common.setarg
+strip = common.strip
+
+--[[ Setup default environement ]]
+env = { prompt = "> ";
+        width = 70;
+        autocompletion = 1;
+        autoalias = 1;
+        welcome = "Remote control interface initialized. Type `help' for help.";
+        flatplaylist = 0;
+      }
+
+--[[ Import custom environement variables from the command line config (if possible) ]]
+for k,v in pairs(env) do
+    if config[k] then
+        if type(env[k]) == type(config[k]) then
+            env[k] = config[k]
+            vlc.msg.dbg("set environement variable `"..k.."' to "..tonumber(env[k]))
+        else
+            vlc.msg.err("environement variable `"..k.."' should be of type "..type(env[k])..". config value will be discarded.")
+        end
+    end
+end
+
+--[[ Command functions ]]
+function set_env(name,client,value)
+    if value then
+        local var,val = split_input(value)
+        if val then
+            s = string.gsub(val,"\"(.*)\"","%1")
+            if type(client.env[var])==type(1) then
+                client.env[var] = tonumber(s)
+            else
+                client.env[var] = s
+            end
+        else
+            client:append( tostring(client.env[var]) )
+        end
+    else
+        for e,v in common.pairs_sorted(client.env) do
+            client:append(e.."="..v)
+        end
+    end
+end
+
+function save_env(name,client,value)
+    env = common.table_copy(client.env)
+end
+
+function alias(client,value)
+    if value then
+        local var,val = split_input(value)
+        if commands[var] and type(commands[var]) ~= type("") then
+            client:append("Error: cannot use a primary command as an alias name")
+        else
+            if commands[val] then
+                commands[var]=val
+            else
+                client:append("Error: unknown primary command `"..val.."'.")
+            end
+        end
+    else
+        for c,v in common.pairs_sorted(commands) do
+            if type(v)==type("") then
+                client:append(c.."="..v)
+            end
+        end
+    end
+end
+
+function fixme(name,client)
+    client:append( "FIXME: unimplemented command `"..name.."'." )
+end
+
+function logout(name,client)
+    if client.type == host.client_type.net then
+        client:send("Bye-bye!")
+        client:del()
+    else
+        client:append("Error: Can't logout of stdin/stdout. Use quit or shutdown to close VLC.")
+    end
+end
+
+function shutdown(name,client)
+    client:append("Bye-bye!")
+    h:broadcast("Shutting down.")
+    vlc.msg.info("Requested shutdown.")
+    vlc.quit()
+end
+
+function quit(name,client)
+    if client.type == host.client_type.net then
+        logout(name,client)
+    else
+        shutdown(name,client)
+    end
+end
+
+function add(name,client,arg)
+    -- TODO: parse (and use) options
+    local f
+    if name == "enqueue" then
+        f = vlc.playlist.enqueue
+    else
+        f = vlc.playlist.add
+    end
+    f({{path=arg}})
+end
+
+function playlist_is_tree( client )
+    if client.env.flatplaylist == 0 then
+        return true
+    else
+        return false
+    end
+end
+
+function playlist(name,client,arg)
+    function playlist0(item,prefix)
+        local prefix = prefix or ""
+        if not item.flags.disabled then
+            local str = "| "..prefix..tostring(item.id).." - "..item.name
+            if item.duration > 0 then
+                str = str.." ("..common.durationtostring(item.duration)..")"
+            end
+            if item.nb_played > 0 then
+                str = str.." [played "..tostring(item.nb_played).." time"
+                if item.nb_played > 1 then
+                    str = str .. "s"
+                end
+                str = str .. "]"
+            end
+            client:append(str)
+        end
+        if item.children then
+            for _, c in ipairs(item.children) do
+                playlist0(c,prefix.."  ")
+            end
+        end
+    end
+    local playlist
+    local tree = playlist_is_tree(client)
+    if name == "search" then
+        playlist = vlc.playlist.search(arg or "", tree)
+    else
+        if tonumber(arg) then
+            playlist = vlc.playlist.get(tonumber(arg), tree)
+        elseif arg then
+            playlist = vlc.playlist.get(arg, tree)
+        else
+            playlist = vlc.playlist.get(nil, tree)
+        end
+    end
+    if name == "search" then
+        client:append("+----[ Search - "..(arg or "`reset'").." ]")
+    else
+        client:append("+----[ Playlist - "..playlist.name.." ]")
+    end
+    if playlist.children then
+        for _, item in ipairs(playlist.children) do
+            playlist0(item)
+        end
+    else
+        playlist0(playlist)
+    end
+    if name == "search" then
+        client:append("+----[ End of search - Use `search' to reset ]")
+    else
+        client:append("+----[ End of playlist ]")
+    end
+end
+
+function playlist_sort(name,client,arg)
+    if not arg then
+        client:append("Valid sort keys are: id, title, artist, genre, random, duration, album.")
+    else
+        local tree = playlist_is_tree(client)
+        vlc.playlist.sort(arg,false,tree)
+    end
+end
+
+function services_discovery(name,client,arg)
+    if arg then
+        if vlc.sd.is_loaded(arg) then
+            vlc.sd.remove(arg)
+            client:append(arg.." disabled.")
+        else
+            vlc.sd.add(arg)
+            client:append(arg.." enabled.")
+        end
+    else
+        local sd = vlc.sd.get_services_names()
+        client:append("+----[ Services discovery ]")
+        for n,ln in pairs(sd) do
+            local status
+            if vlc.sd.is_loaded(n) then
+                status = "enabled"
+            else
+                status = "disabled"
+            end
+            client:append("| "..n..": " .. ln .. " (" .. status .. ")")
+        end
+        client:append("+----[ End of services discovery ]")
+    end
+end
+
+function print_text(label,text)
+    return function(name,client)
+        client:append("+----[ "..label.." ]")
+        client:append "|"
+        for line in string.gmatch(text,".-\r?\n") do
+            client:append("| "..string.gsub(line,"\r?\n",""))
+        end
+        client:append "|"
+        client:append("+----[ End of "..string.lower(label).." ]")
+    end
+end
+
+function help(name,client,arg)
+    local width = client.env.width
+    local long = (name == "longhelp")
+    local extra = ""
+    if arg then extra = "matching `" .. arg .. "' " end
+    client:append("+----[ Remote control commands "..extra.."]")
+    for i, cmd in ipairs(commands_ordered) do
+        if (cmd == "" or not commands[cmd].adv or long)
+        and (not arg or string.match(cmd,arg)) then
+            local str = "| " .. cmd
+            if cmd ~= "" then
+                local val = commands[cmd]
+                if val.aliases then
+                    for _,a in ipairs(val.aliases) do
+                        str = str .. ", " .. a
+                    end
+                end
+                if val.args then str = str .. " " .. val.args end
+                if #str%2 == 1 then str = str .. " " end
+                str = str .. string.rep(" .",(width-(#str+#val.help)-1)/2)
+                str = str .. string.rep(" ",width-#str-#val.help) .. val.help
+            end
+            client:append(str)
+        end
+    end
+    client:append("+----[ end of help ]")
+end
+
+function input_info(name,client)
+    local categories = vlc.input_info()
+    for cat, infos in pairs(categories) do
+        client:append("+----[ "..cat.." ]")
+        client:append("|")
+        for name, value in pairs(infos) do
+            client:append("| "..name..": "..value)
+        end
+        client:append("|")
+    end
+    client:append("+----[ end of stream info ]")
+end
+
+function playlist_status(name,client)
+    local a,b,c = vlc.playlist.status()
+    client:append( "( new input: " .. tostring(a) .. " )" )
+    client:append( "( audio volume: " .. tostring(b) .. " )")
+    client:append( "( state " .. tostring(c) .. " )")
+end
+
+function is_playing(name,client)
+    if vlc.is_playing() then client:append "1" else client:append "0" end
+end
+
+function ret_print(foo,start,stop)
+    local start = start or ""
+    local stop = stop or ""
+    return function(discard,client,...) client:append(start..tostring(foo(...))..stop) end
+end
+
+function get_time(var,client)
+    return function()
+        local input = vlc.object.input()
+        client:append(math.floor(vlc.var.get( input, var )))
+    end
+end
+
+function titlechap(name,client,value)
+    local input = vlc.object.input()
+    local var = string.gsub( name, "_.*$", "" )
+    if value then
+        vlc.var.set( input, var, value )
+    else
+        local item = vlc.var.get( input, var )
+        -- Todo: add item name conversion
+        client:apped(item)
+    end
+end
+function titlechap_offset(client,offset)
+    return function(name,value)
+        local input = vlc.object.input()
+        local var = string.gsub( name, "_.*$", "" )
+        vlc.var.set( input, var, vlc.var.get( input, var )+offset )
+    end
+end
+
+function seek(name,client,value)
+    common.seek(value)
+end
+
+function volume(name,client,value)
+    if value then
+        vlc.volume.set(value)
+    else
+        client:append(tostring(vlc.volume.get()))
+    end
+end
+
+function rate(name,client)
+    local input = vlc.object.input()
+    if name == "normal" then
+        vlc.var.set(input,"rate",1000) -- FIXME: INPUT_RATE_DEFAULT
+    else
+        vlc.var.set(input,"rate-"..name,nil)
+    end
+end
+
+function listvalue(obj,var)
+    return function(client,value)
+        local o = vlc.object.find(nil,obj,"anywhere")
+        if not o then return end
+        if value then
+            vlc.var.set( o, var, value )
+        else
+            local c = vlc.var.get( o, var )
+            local v, l = vlc.var.get_list( o, var )
+            client:append("+----[ "..var.." ]")
+            for i,val in ipairs(v) do
+                local mark = (val==c)and " *" or ""
+                client:append("| "..tostring(val).." - "..tostring(l[i])..mark)
+            end
+            client:append("+----[ end of "..var.." ]")
+        end
+    end
+end
+
+function eval(client,val)
+    client:append(loadstring("return "..val)())
+end
+
+--[[ Declare commands, register their callback functions and provide
+     help strings here.
+     Syntax is:
+     "<command name>"; { func = <function>; [ args = "<str>"; ] help = "<str>"; [ adv = <bool>; ] [ aliases = { ["<str>";]* }; ] }
+     ]]
+commands_ordered = {
+    { "add"; { func = add; args = "XYZ"; help = "add XYZ to playlist" } };
+    { "enqueue"; { func = add; args = "XYZ"; help = "queue XYZ to playlist" } };
+    { "playlist"; { func = playlist; help = "show items currently in playlist" } };
+    { "search"; { func = playlist; args = "[string]"; help = "search for items in playlist (or reset search)" } };
+    { "sort"; { func = playlist_sort; args = "key"; help = "sort the playlist" } };
+    { "sd"; { func = services_discovery; args = "[sd]"; help = "show services discovery or toggle" } };
+    { "play"; { func = skip2(vlc.playlist.play); help = "play stream" } };
+    { "stop"; { func = skip2(vlc.playlist.stop); help = "stop stream" } };
+    { "next"; { func = skip2(vlc.playlist.next); help = "next playlist item" } };
+    { "prev"; { func = skip2(vlc.playlist.prev); help = "previous playlist item" } };
+    { "goto"; { func = skip2(vlc.playlist.goto); help = "goto item at index" } };
+    { "repeat"; { func = skip2(vlc.playlist.repeat_); args = "[on|off]"; help = "toggle playlist repeat" } };
+    { "loop"; { func = skip2(vlc.playlist.loop); args = "[on|off]"; help = "toggle playlist loop" } };
+    { "random"; { func = skip2(vlc.playlist.random); args = "[on|off]"; help = "toggle playlist random" } };
+    { "clear"; { func = skip2(vlc.playlist.clear); help = "clear the playlist" } };
+    { "status"; { func = playlist_status; help = "current playlist status" } };
+    { "title"; { func = titlechap; args = "[X]"; help = "set/get title in current item" } };
+    { "title_n"; { func = titlechap_offset(1); help = "next title in current item" } };
+    { "title_p"; { func = titlechap_offset(-1); help = "previous title in current item" } };
+    { "chapter"; { func = titlechap; args = "[X]"; help = "set/get chapter in current item" } };
+    { "chapter_n"; { func = titlechap_offset(1); help = "next chapter in current item" } };
+    { "chapter_p"; { func = titlechap_offset(-1); help = "previous chapter in current item" } };
+    { "" };
+    { "seek"; { func = seek; args = "X"; help = "seek in seconds, for instance `seek 12'" } };
+    { "pause"; { func = setarg(common.hotkey,"key-play-pause"); help = "toggle pause" } };
+    { "fastforward"; { func = setarg(common.hotkey,"key-jump+extrashort"); help = "set to maximum rate" } };
+    { "rewind"; { func = setarg(common.hotkey,"key-jump-extrashort"); help = "set to minimum rate" } };
+    { "faster"; { func = rate; help = "faster playing of stream" } };
+    { "slower"; { func = rate; help = "slower playing of stream" } };
+    { "normal"; { func = rate; help = "normal playing of stream" } };
+    { "fullscreen"; { func = skip2(vlc.fullscreen); args = "[on|off]"; help = "toggle fullscreen"; aliases = { "f", "F" } } };
+    { "info"; { func = input_info; help = "information about the current stream" } };
+    { "get_time"; { func = get_time("time"); help = "seconds elapsed since stream's beginning" } };
+    { "is_playing"; { func = is_playing; help = "1 if a stream plays, 0 otherwise" } };
+    { "get_title"; { func = ret_print(vlc.get_title); help = "the title of the current stream" } };
+    { "get_length"; { func = get_time("length"); help = "the length of the current stream" } };
+    { "" };
+    { "volume"; { func = volume; args = "[X]"; help = "set/get audio volume" } };
+    { "volup"; { func = ret_print(vlc.volume.up,"( audio volume: "," )"); args = "[X]"; help = "raise audio volume X steps" } };
+    { "voldown"; { func = ret_print(vlc.volume.down,"( audio volume: "," )"); args = "[X]"; help = "lower audio volume X steps" } };
+    { "adev"; { func = skip(listvalue("aout","audio-device")); args = "[X]"; help = "set/get audio device" } };
+    { "achan"; { func = skip(listvalue("aout","audio-channels")); args = "[X]"; help = "set/get audio channels" } };
+    { "atrack"; { func = skip(listvalue("input","audio-es")); args = "[X]"; help = "set/get audio track" } };
+    { "vtrack"; { func = skip(listvalue("input","video-es")); args = "[X]"; help = "set/get video track" } };
+    { "vratio"; { func = skip(listvalue("vout","aspect-ratio")); args = "[X]"; help = "set/get video aspect ratio" } };
+    { "vcrop"; { func = skip(listvalue("vout","crop")); args = "[X]"; help = "set/get video crop"; aliases = { "crop" } } };
+    { "vzoom"; { func = skip(listvalue("vout","zoom")); args = "[X]"; help = "set/get video zoom"; aliases = { "zoom" } } };
+    { "snapshot"; { func = common.snapshot; help = "take video snapshot" } };
+    { "strack"; { func = skip(listvalue("input","spu-es")); args = "[X]"; help = "set/get subtitles track" } };
+    { "hotkey"; { func = skip(common.hotkey); args = "[hotkey name]"; help = "simulate hotkey press"; adv = true; aliases = { "key" } } };
+    { "menu"; { func = fixme; args = "[on|off|up|down|left|right|select]"; help = "use menu"; adv = true } };
+    { "" };
+    { "set"; { func = set_env; args = "[var [value]]"; help = "set/get env var"; adv = true } };
+    { "save_env"; { func = save_env; help = "save env vars (for future clients)"; adv = true } };
+    { "alias"; { func = skip(alias); args = "[cmd]"; help = "set/get command aliases"; adv = true } };
+    { "eval"; { func = skip(eval); help = "eval some lua (*debug*)"; adv =true } }; -- FIXME: comment out if you're not debugging
+    { "description"; { func = print_text("Description",description); help = "describe this module" } };
+    { "license"; { func = print_text("License message",vlc.license()); help = "print VLC's license message"; adv = true } };
+    { "help"; { func = help; args = "[pattern]"; help = "a help message"; aliases = { "?" } } };
+    { "longhelp"; { func = help; args = "[pattern]"; help = "a longer help message" } };
+    { "logout"; { func = logout; help = "exit (if in a socket connection)" } };
+    { "quit"; { func = quit; help = "quit VLC (or logout if in a socket connection)" } };
+    { "shutdown"; { func = shutdown; help = "shutdown VLC" } };
+    }
+commands = {}
+for i, cmd in ipairs( commands_ordered ) do
+    if #cmd == 2 then
+        commands[cmd[1]]=cmd[2]
+        if cmd[2].aliases then
+            for _,a in ipairs(cmd[2].aliases) do
+                commands[a]=cmd[1]
+            end
+        end
+    end
+    commands_ordered[i]=cmd[1]
+end
+--[[ From now on commands_ordered is a list of the different command names
+     and commands is a associative array indexed by the command name. ]]
+
+-- Compute the column width used when printing a the autocompletion list
+env.colwidth = 0
+for c,_ in pairs(commands) do
+    if #c > env.colwidth then env.colwidth = #c end
+end
+env.coldwidth = env.colwidth + 1
+
+-- Count unimplemented functions
+do
+    local count = 0
+    local list = "("
+    for c,v in pairs(commands) do
+        if v.func == fixme then
+            count = count + 1
+            if count ~= 1 then
+                list = list..","
+            end
+            list = list..c
+        end
+    end
+    list = list..")"
+    if count ~= 0 then
+        env.welcome = env.welcome .. "\r\nWarning: "..count.." functions are still unimplemented "..list.."."
+    end
+end
+
+--[[ Utils ]]
+function split_input(input)
+    local input = strip(input)
+    local s = string.find(input," ")
+    if s then
+        return string.sub(input,0,s-1), strip(string.sub(input,s))
+    else
+        return input
+    end
+end
+
+function call_command(cmd,client,arg)
+    if type(commands[cmd]) == type("") then
+        cmd = commands[cmd]
+    end
+    local ok, msg
+    if arg ~= nil then
+        ok, msg = pcall( commands[cmd].func, cmd, client, arg )
+    else
+        ok, msg = pcall( commands[cmd].func, cmd, client )
+    end
+    if not ok then
+        local a = arg or ""
+        if a ~= "" then a = " " .. a end
+        client:append("Error in `"..cmd..a.."' ".. msg)
+    end
+end
+
+function call_libvlc_command(cmd,client,arg)
+    local ok, vlcerr, vlcmsg = pcall( vlc.libvlc_command, cmd, arg )
+    if not ok then
+        local a = arg or ""
+        if a ~= "" then a = " " .. a end
+        client:append("Error in `"..cmd..a.."' ".. vlcerr) -- when pcall fails, the 2nd arg is the error message.
+    end
+    return vlcerr
+end
+
+--[[ Setup host ]]
+require("host")
+h = host.host()
+-- No auth
+h.status_callbacks[host.status.password] = function(client)
+    client.env = common.table_copy( env )
+    client:send( client.env.welcome .. "\r\n")
+    client:switch_status(host.status.read)
+end
+-- Print prompt when switching a client's status to `read'
+h.status_callbacks[host.status.read] = function(client)
+    client:send( client.env.prompt )
+end
+
+h:listen( config.hosts or config.host or "*console" )
+
+--[[ The main loop ]]
+while not vlc.should_die() do
+    h:accept()
+    local write, read = h:select(0.1)
+
+    for _, client in pairs(write) do
+        local len = client:send()
+        client.buffer = string.sub(client.buffer,len+1)
+        if client.buffer == "" then client:switch_status(host.status.read) end
+    end
+
+    for _, client in pairs(read) do
+        local input = client:recv(1000)
+        local done = false
+        if string.match(input,"\n$") then
+            client.buffer = string.gsub(client.buffer..input,"\r?\n$","")
+            done = true
+        elseif client.buffer == ""
+           and ((client.type == host.client_type.stdio and input == "")
+           or  (client.type == host.client_type.net and input == "\004")) then
+            -- Caught a ^D
+            client.buffer = "quit"
+            done = true
+        else
+            client.buffer = client.buffer .. input
+        end
+        if done then
+            local cmd,arg = split_input(client.buffer)
+            client.buffer = ""
+            client:switch_status(host.status.write)
+            if commands[cmd] then
+                call_command(cmd,client,arg)
+            else
+                if client.type == host.client_type.stdio 
+                and call_libvlc_command(cmd,client,arg) == 0 then
+                else
+                    local choices = {}
+                    if client.env.autocompletion ~= 0 then
+                        for v,_ in common.pairs_sorted(commands) do
+                            if string.sub(v,0,#cmd)==cmd then
+                                table.insert(choices, v)
+                            end
+                        end
+                    end
+                    if #choices == 1 and client.env.autoalias ~= 0 then
+                        -- client:append("Aliasing to \""..choices[1].."\".")
+                        cmd = choices[1]
+                        call_command(cmd,client,arg)
+                    else
+                        client:append("Unknown command `"..cmd.."'. Type `help' for help.")
+                        if #choices ~= 0 then
+                            client:append("Possible choices are:")
+                            local cols = math.floor(client.env.width/(client.env.colwidth+1))
+                            local fmt = "%-"..client.env.colwidth.."s"
+                            for i = 1, #choices do
+                                choices[i] = string.format(fmt,choices[i])
+                            end
+                            for i = 1, #choices, cols do
+                                local j = i + cols - 1
+                                if j > #choices then j = #choices end
+                                client:append("  "..table.concat(choices," ",i,j))
+                            end
+                        end
+                    end
+                end
+            end
+        end
+    end
+end
diff --git a/share/lua/intf/telnet.lua b/share/lua/intf/telnet.lua
new file mode 100644 (file)
index 0000000..1f40af0
--- /dev/null
@@ -0,0 +1,222 @@
+--[==========================================================================[
+ telnet.lua: VLM interface plugin
+--[==========================================================================[
+ Copyright (C) 2007 the VideoLAN team
+ $Id$
+
+ Authors: Antoine Cellerier <dionoea at videolan dot 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.
+--]==========================================================================]
+
+description=
+[============================================================================[
+ VLM Interface plugin
+
+ Copy (features wise) of the original VLC modules/control/telnet.c module.
+
+ Differences are:
+    * it's in Lua
+    * 'lock' command to lock the telnet promt
+    * possibility to listen on different hosts including stdin
+      for example:
+        listen on stdin: vlc -I lua --lua-intf telnet --lua-config "telnet={host='*console'}"
+        listen on stdin + 2 ports on localhost: vlc -I lua --lua-intf telnet --lua-config "telnet={hosts={'localhost:4212','localhost:5678','*console'}}"
+ Configuration options setable throught the --lua-config option are:
+    * hosts: A list of hosts to listen on (see examples above).
+    * host: A host to listen on. (won't be used if `hosts' is set)
+    * password: The password used for remote clients.
+    * prompt: The prompt.
+]============================================================================]
+
+require "host"
+
+--[[ Some telnet command special characters ]]
+WILL = "\251" -- Indicates the desire to begin performing, or confirmation that you are now performing, the indicated option.
+WONT = "\252" -- Indicates the refusal to perform, or continue performing, the indicated option.
+DO   = "\253" -- Indicates the request that the other party perform, or confirmation that you are expecting the other party to perform, the indicated option.
+DONT = "\254" -- Indicates the demand that the other party stop performing, or confirmation that you are no longer expecting the other party to perform, the indicated option.
+IAC  = "\255" -- Interpret as command
+
+ECHO = "\001"
+
+--[[ Client status change callbacks ]]
+function on_password( client )
+    if client.type == host.client_type.net then
+        client:send( "Password: " ..IAC..WILL..ECHO )
+    else
+        -- no authentification needed on stdin
+        client:switch_status( host.status.read )
+    end
+end
+function on_read( client )
+    client:send( config.prompt and tostring(config.prompt) or "> " )
+end
+function on_write( client )
+end
+
+--[[ Misc functions ]]
+function telnet_commands( client )
+    -- remove telnet command replies from the client's data
+    client.buffer = string.gsub( client.buffer, IAC.."["..DO..DONT..WILL..WONT.."].", "" )
+end
+
+function vlm_message_to_string(client,message,prefix)
+    local prefix = prefix or ""
+    if message.value then
+        client:append(prefix .. message.name .. " : " .. message.value)
+        return
+    else
+        client:append(prefix .. message.name)
+        if message.children then
+            for i,c in ipairs(message.children) do
+                vlm_message_to_string(client,c,prefix.."    ")
+            end
+        end
+        return
+    end
+end
+
+--[[ Configure the host ]]
+h = host.host()
+
+h.status_callbacks[host.status.password] = on_password
+h.status_callbacks[host.status.read] = on_read
+h.status_callbacks[host.status.write] = on_write
+
+h:listen( config.hosts or config.host or "localhost:4212" )
+password = config.password or "admin"
+
+--[[ Launch vlm ]]
+vlm = vlc.vlm.new()
+
+--[[ Commands ]]
+function shutdown(client)
+    h:broadcast("Shutting down.\r\n")
+    vlc.msg.err("shutdown requested")
+    vlc.quit()
+    return true
+end
+function logout(client)
+    client:del()
+    return true
+end
+function quit(client)
+    if client.type == host.client_type.net then
+        return logout(client)
+    else
+        return shutdown(client)
+    end
+end
+function lock(client)
+    client:send("\r\n")
+    client:switch_status( host.status.password )
+    client.buffer = ""
+    return false
+end
+function print_text(text)
+    return function(client)
+        client:append(string.gsub(text,"\r?\n","\r\n"))
+        return true
+    end
+end
+function help(client)
+    client:append("    Telnet Specific Commands:")
+    for c,t in pairs(commands) do
+        client:append("        "..c.." : "..t.help)
+    end
+    return true
+end
+commands = {
+    ["shutdown"]    = { func = shutdown, help = "shutdown VLC" },
+    ["quit"]        = { func = quit, help = "logout from telnet/shutdown VLC from local shell" },
+    ["logout"]      = { func = logout, help = "logout" },
+    ["lock"]        = { func = lock, help = "lock the telnet prompt" },
+    ["description"] = { func = print_text(description), help = "describe this module" },
+    ["license"]     = { func = print_text(vlc.license()), help = "print VLC's license message" },
+    ["help"]        = { func = help, help = "show this help", dovlm = true },
+    }
+
+function client_command( client )
+    local cmd = client.buffer
+    client.buffer = ""
+    if not commands[cmd] or not commands[cmd].func or commands[cmd].dovlm then
+        -- if it's not an interface specific command, it has to be a VLM command
+        local message, vlc_err = vlc.vlm.execute_command( vlm, cmd )
+        vlm_message_to_string( client, message )
+        if not commands[cmd] or not commands[cmd].func and not commands[cmd].dovlm then
+            if vlc_err ~= 0 then client:append( "Type `help' for help." ) end
+            return true
+        end
+    end
+    ok, msg = pcall( commands[cmd].func, client )
+    if not ok then
+        client:append( "Error in `"..cmd.."' "..msg )
+        return true
+    end
+    return msg
+end
+
+--[[ The main loop ]]
+while not vlc.should_die() do
+    h:accept()
+    local w, r = h:select( 0.1 )
+
+    -- Handle writes
+    for _, client in pairs(w) do
+        local len = client:send()
+        client.buffer = string.sub(client.buffer,len+1)
+        if client.buffer == "" then client:switch_status( host.status.read ) end
+    end
+
+    -- Handle reads
+    for _, client in pairs(r) do
+        local str = client:recv(1000)
+        local done = false
+        if string.match(str,"\n$") then
+            client.buffer = string.gsub(client.buffer..str,"\r?\n$","")
+            done = true
+        elseif client.buffer == ""
+           and ((client.type == host.client_type.stdio and str == "")
+           or  (client.type == host.client_type.net and str == "\004")) then
+            -- Caught a ^D
+            client.buffer = "quit"
+            done = true
+        else
+            client.buffer = client.buffer .. str
+        end
+        if client.type == host.client_type.net then
+            telnet_commands( client )
+        end
+        if done then
+            if client.status == host.status.password then
+                if client.buffer == password then
+                    client:send( IAC..WONT..ECHO.."\r\nWelcome, Master\r\n" )
+                    client.buffer = ""
+                    client:switch_status( host.status.write )
+                else
+                    client:send( "\r\nWrong password\r\nPassword: " )
+                    client.buffer = ""
+                end
+            elseif client_command( client ) then
+                client:switch_status( host.status.write )
+            end
+        end
+    end
+end
+
+--[[ Clean up ]]
+vlc.vlm.delete( vlm )
diff --git a/share/lua/meta/README.txt b/share/lua/meta/README.txt
new file mode 100644 (file)
index 0000000..42eed1c
--- /dev/null
@@ -0,0 +1,56 @@
+Instructions to code your own VLC Lua meta script.
+$Id$
+
+Examples: See googleimage.lua .
+
+VLC Lua meta modules should define one of the following functions:
+ * fetch_art(): returns a path to an artwork for the given item
+ * fetch_meta(): returns a table with the following items:
+                .path: the item's full path / URL
+                .name: the item's name in playlist (OPTIONAL)
+                .title: the item's Title (OPTIONAL, meta data)
+                .artist: the item's Artist (OPTIONAL, meta data)
+                .genre: the item's Genre (OPTIONAL, meta data)
+                .copyright: the item's Copyright (OPTIONAL, meta data)
+                .album: the item's Album (OPTIONAL, meta data)
+                .tracknum: the item's Tracknum (OPTIONAL, meta data)
+                .description: the item's Description (OPTIONAL, meta data)
+                .rating: the item's Rating (OPTIONAL, meta data)
+                .date: the item's Date (OPTIONAL, meta data)
+                .setting: the item's Setting (OPTIONAL, meta data)
+                .url: the item's URL (OPTIONAL, meta data)
+                .language: the item's Language (OPTIONAL, meta data)
+                .nowplaying: the item's NowPlaying (OPTIONAL, meta data)
+                .publisher: the item's Publisher (OPTIONAL, meta data)
+                .encodedby: the item's EncodedBy (OPTIONAL, meta data)
+                .arturl: the item's ArtURL (OPTIONAL, meta data)
+                .trackid: the item's TrackID (OPTIONAL, meta data)
+                .options: a list of VLC options (OPTIONAL)
+                          example: .options = { "fullscreen" }
+                .duration: stream duration in seconds (OPTIONAL)
+                .meta: custom meta data (OPTIONAL, meta data)
+                       A .meta field is a table of custom meta categories which
+                       each have custom meta properties.
+                       example: .meta = { ["Google video"] = { ["docid"] = "-5784010886294950089"; ["GVP version"] = "1.1" }; ["misc"] = { "Hello" = "World!" } }
+            Invalid playlist items will be discarded by VLC.
+
+VLC defines a global vlc object with the following members:
+ * vlc.stream_new
+ * vlc.stream_delete
+ * vlc.stream_readline
+ * vlc.stream_read
+ * vlc.decode_uri( <string> ): decode %xy characters in a string.
+ * vlc.resolve_xml_special_chars( <string> ): decode &abc; characters in a
+                                             string.
+ * vlc.msg_dbg( <string> ): print a debug message.
+ * vlc.msg_warn( <string> ): print a warning message.
+ * vlc.msg_err( <string> ): print an error message.
+ * vlc.msg_info( <string> ): print an info message.
+
+Lua scripts are tried in alphabetical order in the user's VLC config
+director lua/meta/ subdirectory, then in the global VLC lua/meta/
+directory.
+
+Lua documentation is available on http://www.lua.org .
+VLC uses Lua 5.1
+All the Lua standard libraries are available.
diff --git a/share/lua/meta/googleimage.lua b/share/lua/meta/googleimage.lua
new file mode 100644 (file)
index 0000000..6bc7456
--- /dev/null
@@ -0,0 +1,52 @@
+--[[
+ Gets an artwork from images.google.com
+
+ $Id$
+ Copyright © 2007 the VideoLAN team
+
+ 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.
+--]]
+
+-- Replace non alphanumeric char by +
+function get_query( title )
+    -- If we have a .EXT remove the extension.
+    str = string.gsub( title, "(.*)%....$", "%1" )
+    return string.gsub( str, "([^%w ])",
+         function (c) return string.format ("%%%02X", string.byte(c)) end)
+end
+
+-- Return the artwork
+function fetch_art()
+    if vlc.artist and vlc.album then
+        title = vlc.artist.." "..vlc.album
+    elseif vlc.title and vlc.artist then
+        title = vlc.artist.." "..vlc.title
+    elseif vlc.title then
+        title = vlc.title
+    elseif vlc.name then
+        title = vlc.name
+    else
+        return nil
+    end
+    fd = vlc.stream_new( "http://images.google.com/images?q=" .. get_query( title ) )
+    page = vlc.stream_read( fd, 65653 )
+    vlc.stream_delete( fd )
+    _, _, arturl = string.find( page, "imgurl=([^&]+)" )
+    if arturl then
+        return vlc.decode_uri(arturl)
+    else
+        return nil
+    end
+end
diff --git a/share/lua/playlist/README.txt b/share/lua/playlist/README.txt
new file mode 100644 (file)
index 0000000..c2f800f
--- /dev/null
@@ -0,0 +1,62 @@
+Instructions to code your own VLC Lua playlist script.
+$Id$
+
+Examples: See dailymotion.lua, googlevideo.lua, metacafe.lua, youbtube.lua
+          and youtube_homepage.lua .
+
+VLC Lua playlist modules should define two functions:
+ * probe(): returns true if we want to handle the playlist in this script
+ * parse(): read the incoming data and return playlist item(s)
+            The playlist is a table of playlist objects.
+            A playlist object has the following members:
+                .path: the item's full path / URL
+                .name: the item's name in playlist (OPTIONAL)
+                .title: the item's Title (OPTIONAL, meta data)
+                .artist: the item's Artist (OPTIONAL, meta data)
+                .genre: the item's Genre (OPTIONAL, meta data)
+                .copyright: the item's Copyright (OPTIONAL, meta data)
+                .album: the item's Album (OPTIONAL, meta data)
+                .tracknum: the item's Tracknum (OPTIONAL, meta data)
+                .description: the item's Description (OPTIONAL, meta data)
+                .rating: the item's Rating (OPTIONAL, meta data)
+                .date: the item's Date (OPTIONAL, meta data)
+                .setting: the item's Setting (OPTIONAL, meta data)
+                .url: the item's URL (OPTIONAL, meta data)
+                .language: the item's Language (OPTIONAL, meta data)
+                .nowplaying: the item's NowPlaying (OPTIONAL, meta data)
+                .publisher: the item's Publisher (OPTIONAL, meta data)
+                .encodedby: the item's EncodedBy (OPTIONAL, meta data)
+                .arturl: the item's ArtURL (OPTIONAL, meta data)
+                .trackid: the item's TrackID (OPTIONAL, meta data)
+                .options: a list of VLC options (OPTIONAL)
+                          example: .options = { "fullscreen" }
+                .duration: stream duration in seconds (OPTIONAL)
+                .meta: custom meta data (OPTIONAL, meta data)
+                       A .meta field is a table of custom meta categories which
+                       each have custom meta properties.
+                       example: .meta = { ["Google video"] = { ["docid"] = "-5784010886294950089"; ["GVP version"] = "1.1" }; ["misc"] = { "Hello" = "World!" } }
+            Invalid playlist items will be discarded by VLC.
+
+VLC defines a global vlc object with the following members:
+ * vlc.path: the URL string (without the leading http:// or file:// element)
+ * vlc.access: the access used ("http" for http://, "file" for file://, etc.)
+ * vlc.peek( <int> ): return the first <int> characters from the playlist file.
+ * vlc.read( <int> ): read <int> characters from the playlist file.
+                      THIS FUNCTION CANNOT BE USED IN peek().
+ * vlc.readline(): return a new line of playlist data on each call.
+                   THIS FUNCTION CANNOT BE USED IN peek().
+ * vlc.decode_uri( <string> ): decode %xy characters in a string.
+ * vlc.resolve_xml_special_chars( <string> ): decode &abc; characters in a
+                                             string.
+ * vlc.msg_dbg( <string> ): print a debug message.
+ * vlc.msg_warn( <string> ): print a warning message.
+ * vlc.msg_err( <string> ): print an error message.
+ * vlc.msg_info( <string> ): print an info message.
+
+Lua scripts are tried in alphabetical order in the user's VLC config
+director lua/playlist/ subdirectory, then in the global VLC lua/playlist/
+directory.
+
+Lua documentation is available on http://www.lua.org .
+VLC uses Lua 5.1
+All the Lua standard libraries are available.
diff --git a/share/lua/playlist/appletrailers.lua b/share/lua/playlist/appletrailers.lua
new file mode 100644 (file)
index 0000000..5a754ae
--- /dev/null
@@ -0,0 +1,65 @@
+--[[
+   Translate trailers.apple.com video webpages URLs to the corresponding
+   movie URL
+
+ $Id$
+ Copyright © 2007 the VideoLAN team
+
+ 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, "trailers.apple.com" ) 
+end
+
+-- Parse function.
+function parse()
+    p = {}
+    while true
+    do 
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "http://movies.apple.com/movies/.*%.mov" )
+        or string.match( line, "http://images.apple.com/movies/.*%.mov" )
+        then
+            if string.match( line, "http://movies.apple.com/movies/.*%.mov" ) then
+                path = vlc.decode_uri( string.gsub( line, "^.*(http://movies.apple.com/movies/.*%.mov).*$", "%1" ) )
+            elseif string.match( line, "http://images.apple.com/movies/.*%.mov" ) then
+                path = vlc.decode_uri( string.gsub( line, "^.*(http://images.apple.com/movies/.*%.mov).*$", "%1" ) )
+            end
+            if string.match( path, "480p" ) then
+                extraname = " (480p)"
+            elseif string.match( path, "720p" ) then
+                extraname = " (720p)"
+            elseif string.match( path, "1080p" ) then
+                extraname = " (1080p)"
+            else
+                extraname = ""
+            end
+            table.insert( p, { path = path; name = title..extraname; description = description; url = vlc.path } )
+        end
+        if string.match( line, "<title>" )
+        then
+            title = vlc.decode_uri( string.gsub( line, "^.*<title>([^<]*).*$", "%1" ) )
+        end
+        if string.match( line, "<meta name=\"Description\"" )
+        then
+            description = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"Description\" content=\"([^\"]*)\".*$", "%1" ) )
+        end
+    end
+    return p
+end
diff --git a/share/lua/playlist/break.lua b/share/lua/playlist/break.lua
new file mode 100644 (file)
index 0000000..1c18a0c
--- /dev/null
@@ -0,0 +1,52 @@
+--[[
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "www.break.com" ) 
+end
+
+-- Parse function.
+function parse()
+    filepath = ""
+    filename = ""
+    filetitle = ""
+    arturl = ""
+    while true do
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "sGlobalContentFilePath=" ) then
+            filepath= string.gsub( line, ".*sGlobalContentFilePath='([^']*).*", "%1" )
+        end
+        if string.match( line, "sGlobalFileName=" ) then
+            filename = string.gsub( line, ".*sGlobalFileName='([^']*).*", "%1")
+        end
+        if string.match( line, "sGlobalContentTitle=" ) then
+            filetitle = string.gsub( line, ".*sGlobalContentTitle='([^']*).*", "%1")
+        end
+        if string.match( line, "el=\"videothumbnail\" href=\"" ) then
+            arturl = string.gsub( line, ".*el=\"videothumbnail\" href=\"([^\"]*).*", "%1" )
+        end
+        if string.match( line, "videoPath" ) then
+            return { { path = ( string.gsub( line, ".*videoPath', '([^']*).*", "%1" ) )..filepath.."/"..filename..".flv"; title = filetitle; arturl = arturl } }
+        end
+    end
+end
diff --git a/share/lua/playlist/canalplus.lua b/share/lua/playlist/canalplus.lua
new file mode 100644 (file)
index 0000000..a83ad92
--- /dev/null
@@ -0,0 +1,87 @@
+--[[
+ $Id: $
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "www.canalplus.fr" )
+end
+
+-- Parse function.
+function parse()
+    p = {}
+    --vlc.msg_dbg( vlc.path )
+    if string.match( vlc.path, "www.canalplus.fr/index.php%?pid=" )
+    then -- This is the HTML page's URL
+        local id, name, description, arturl
+        while true do
+            -- Try to find the video's title
+            local line = vlc.readline()
+            if not line then break end
+            -- vlc.msg_dbg( line )
+            if string.match( line, "aVideos" ) then
+                if string.match( line, "CONTENT_ID.*=" ) then
+                    id = string.gsub( line, "^.*\"(.-)\".*$", "%1" )
+                elseif string.match( line, "CONTENT_VNC_TITRE" ) then
+                    arturl = string.gsub( line, "^.*src=\"(.-)\".*$", "%1" )
+                    name = string.gsub( line, "^.*alt=\"(.-)\".*$", "%1" )
+                elseif string.match( line, "CONTENT_VNC_DESCRIPTION" ) then
+                    description = string.gsub( line, "^.*\"(.-)\".*$", "%1" )
+                end
+                if id and string.match( line, "new Array" ) then
+                    add_item( p, id, name, description, arturl )
+                    id = nil
+                    name = nil
+                    arturl = nil
+                    description = nil
+                end
+            end
+        end
+        if id then
+            add_item( p, id, name, description, arturl )
+        end
+        return p
+    elseif string.match( vlc.path, "embed%-video%-player" ) then
+        while true do
+            local line = vlc.readline()
+            if not line then break end
+            --vlc.msg_dbg( line )
+            if string.match( line, "<hi>" ) then
+                local path = string.gsub( line, "^.*%[(.-)%].*$", "%1" )
+                vlc.msg_err("Path is: " .. tostring( path ) )
+                return { { path = path } }
+            end
+        end
+    end
+end
+
+function get_url_param( url, name )
+    return string.gsub( url, "^.*[&?]"..name.."=([^&]*).*$", "%1" )
+end
+
+function add_item( p, id, name, description, arturl )
+    --[[vlc.msg_dbg( "id: " .. tostring(id) )
+    vlc.msg_dbg( "name: " .. tostring(name) )
+    vlc.msg_dbg( "arturl: " .. tostring(arturl) )
+    vlc.msg_dbg( "description: " .. tostring(description) )
+    --]]
+    --local path = "http://www.canalplus.fr/flash/xml/configuration/configuration-embed-video-player.php?xmlParam="..id.."-"..get_url_param(vlc.path,"pid")
+    local path = "http://www.canalplus.fr/flash/xml/module/embed-video-player/embed-video-player.php?video_id="..id.."&pid="..get_url_param(vlc.path,"pid")
+    table.insert( p, { path = path; name = name; description = description; arturl = arturl } )
+end
diff --git a/share/lua/playlist/dailymotion.lua b/share/lua/playlist/dailymotion.lua
new file mode 100644 (file)
index 0000000..2cbae59
--- /dev/null
@@ -0,0 +1,81 @@
+--[[
+    Translate Daily Motion video webpages URLs to the corresponding
+    FLV URL.
+
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "dailymotion.com" ) 
+        and string.match( vlc.peek( 256 ), "<!DOCTYPE.*<title>Video " )
+end
+
+-- Parse function.
+function parse()
+    while true
+    do 
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "param name=\"flashvars\" value=\".*video=" )
+        then
+            arturl = vlc.decode_uri( string.gsub( line, "^.*param name=\"flashvars\" value=\".*preview=([^&]*).*$", "%1" ) )
+            videos = vlc.decode_uri( string.gsub( line, "^.*param name=\"flashvars\" value=\".*video=([^&]*).*$", "%1" ) )
+       --[[ we get a list of different streams available, at various codecs
+            and resolutions:
+            /A@@spark||/B@@spark-mini||/C@@vp6-hd||/D@@vp6||/E@@h264
+            Not everybody can decode HD, not everybody has a 80x60 screen,
+            H264/MP4 is buggy , so i choose VP6 as the highest priority
+
+            Ideally, VLC would propose the different streams available, codecs
+            and resolutions (the resolutions are part of the URL)
+
+            For now we just built a list of preferred codecs : lowest value
+            means highest priority
+         ]]
+            local pref = { ["vp6"]=0, ["spark"]=1, ["h264"]=2, ["vp6-hd"]=3, ["spark-mini"]=4 }
+            local available = {}
+            for n in string.gmatch(videos, "[^|]+") do
+                i = string.find(n, "@@")
+                if i then
+                    available[string.sub(n, i+2)] = string.sub(n, 0, i-1)
+                end
+            end
+            local score = 666
+            local bestcodec
+            for codec,_ in pairs(available) do
+                if pref[codec] < score then
+                    bestcodec = codec
+                    score = pref[codec]
+                end
+            end
+            if bestcodec then
+                path = "http://dailymotion.com" .. available[bestcodec]
+            end
+        end
+        if string.match( line, "<meta name=\"description\"" )
+        then
+            name = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"description\" content=\"%w+ (.*) %w+ %w+ %w+ %w+ Videos\..*$", "%1" ) )
+            description = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"description\" content=\"%w+ .* %w+ %w+ %w+ %w+ Videos\. ([^\"]*)\".*$", "%1" ) )
+        end
+        if path and name and description and arturl then break end
+    end
+    return { { path = path; name = name; description = description; url = vlc.path; arturl = arturl } }
+end
diff --git a/share/lua/playlist/googlevideo.lua b/share/lua/playlist/googlevideo.lua
new file mode 100644 (file)
index 0000000..57cc281
--- /dev/null
@@ -0,0 +1,43 @@
+--[[
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "video.google.com" ) 
+        and string.match( vlc.path, "videoplay" )
+end
+
+-- Parse function.
+function parse()
+    while true
+    do
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "^<title>" ) then
+            title = string.gsub( line, "<title>([^<]*).*", "%1" )
+        end
+        if string.match( line, "src=\"/googleplayer.swf" ) then
+            url = string.gsub( line, ".*videoUrl=([^&]*).*" ,"%1" )
+            arturl = string.gsub( line, ".*thumbnailUrl=([^\"]*).*", "%1" )
+            return { { path = vlc.decode_uri(url), title = title, arturl = vlc.decode_uri(arturl) } }
+        end
+    end
+end
diff --git a/share/lua/playlist/joox.lua b/share/lua/playlist/joox.lua
new file mode 100644 (file)
index 0000000..9ce15cd
--- /dev/null
@@ -0,0 +1,45 @@
+--[[
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "joox.net" ) or
+            string.match( vlc.path, "/iframe.php%?video=1&" )
+end
+
+-- Parse function.
+function parse()
+    vidtitle = ""
+    while true do
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "iframe" ) then
+            -- extract the iframe
+            print((string.gsub( line, ".*iframe src=\"([^\"]*).*", "%1" ) ))
+            return { { path = (string.gsub( line, ".*iframe src=\"([^\"]*).*", "%1" )) } }
+        end
+        if string.match( line, "<param name=\"src" ) then
+            -- extract the video url from the iframe
+            print( (string.gsub( line, ".*src\" value=\"([^\"]*).*", "%1" )))
+            return { { path = (string.gsub( line, ".*src\" value=\"([^\"]*).*", "%1" )) } }
+        end
+    end
+end
diff --git a/share/lua/playlist/lelombrik.lua b/share/lua/playlist/lelombrik.lua
new file mode 100644 (file)
index 0000000..82fb472
--- /dev/null
@@ -0,0 +1,46 @@
+--[[
+ French humor site: http://lelombrik.net
+
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "lelombrik.net/videos" ) 
+end
+
+-- Parse function.
+function parse()
+    vidtitle = ""
+    while true do
+        line = vlc.readline()
+        if not line then break end
+        if string.match( line, "id=\"nom_fichier\">" ) then
+            vidtitle = string.gsub( line, ".*\"nom_fichier\">([^<]*).*", "%1" )
+        end
+        if string.match( line, "flvplayer.swf" ) then
+            -- fallback: retrieve the title from the url if we didn't find it
+            if vidtitle == "" then
+                vidtitle = string.gsub( vlc.path, ".*/([^.]*).*", "%1" )
+            end
+            return { { path = string.gsub( line, ".*flashvars=\"&file=([^&]*).*", "%1" ); arturl = string.gsub( line, ".*&image=([^&]*).*", "%1" ); title = vidtitle } }
+        end
+    end
+end
diff --git a/share/lua/playlist/megavideo.lua b/share/lua/playlist/megavideo.lua
new file mode 100644 (file)
index 0000000..44a04f2
--- /dev/null
@@ -0,0 +1,76 @@
+--[[
+    Translate MegaVideo video webpages URLs to the corresponding FLV URL.
+
+ $Id$
+
+ Copyright © 2008 the VideoLAN team
+
+ 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, "megavideo.com" ) 
+end
+
+-- Parse function.
+function parse()
+
+    -- we have to get the xml
+    if string.match( vlc.path, "www.megavideo.com.*&v=.*&u=.*" ) then
+        id = string.gsub( vlc.path, "www.megavideo.com.*v=([^&]*).*$", "%1" )
+        path = "http://www.megavideo.com/xml/videolink.php?v=" .. id
+        return { { path = path } }
+    end
+
+    while true
+    do 
+        line = vlc.readline()
+        if not line then break end
+
+        -- we got the xml
+        if string.match( line, "<ROWS><ROW url=\"" )
+        then
+            xml = ""
+            while line do
+                -- buffer the full xml
+                xml = xml .. line .. '\n'
+                line = vlc.readline()
+            end
+            -- now gets the encoded url
+            s = string.gsub( xml, ".*ROW url=\"([^\"]*).*", "%1" )
+            path = ""
+            i = 1
+            while s:byte(i) do
+                c = s:byte(i)
+                if c % 4 < 2 then mod = 0 else mod = 4 end
+                if c < 16 and c > 3 then key = 61 + mod
+                elseif c < 96 and c > 67 then key = 189 + mod
+                elseif c < 20 and c > 6 then key = 65
+                else vlc.msg_err("Oops, please report URL to developers")
+                end
+                i = i + 1
+                path = path .. string.char(key - c)
+            end
+        end
+        if path then break end
+    end
+    if path then
+        return { { path = path } }
+    else
+        return { }
+    end
+end
diff --git a/share/lua/playlist/metacafe.lua b/share/lua/playlist/metacafe.lua
new file mode 100644 (file)
index 0000000..b7ceb3e
--- /dev/null
@@ -0,0 +1,52 @@
+--[[
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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, "metacafe.com" ) 
+        and (  string.match( vlc.path, "watch/" )
+            or string.match( vlc.path, "mediaURL=" ) )
+end
+
+-- Parse function.
+function parse()
+    if string.match( vlc.path, "watch/" )
+    then -- This is the HTML page's URL
+        while true do
+            -- Try to find the video's title
+            line = vlc.readline()
+            if not line then break end
+            if string.match( line, "<meta name=\"title\"" ) then
+                name = string.gsub( line, "^.*content=\"Metacafe %- ([^\"]*).*$", "%1" )  
+            end
+            if string.match( line, "<meta name=\"description\"" ) then
+                description = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )  
+            end
+            if string.match( line, "<link rel=\"image_src\"" ) then
+                arturl = string.gsub( line, "^.*href=\"([^\"]*)\".*$", "%1" )
+            end
+            if name and description and arturl then break end
+        end
+        return { { path = string.gsub( vlc.path, "^.*watch/(.*[^/])/?$", "http://www.metacafe.com/fplayer/%1.swf" ); name = name; description = description; arturl = arturl;  } }
+    else -- This is the flash player's URL
+        return { { path = string.gsub( vlc.path, "^.*mediaURL=([^&]*).*$", "%1" ) } }
+    end
+end
diff --git a/share/lua/playlist/youtube.lua b/share/lua/playlist/youtube.lua
new file mode 100644 (file)
index 0000000..ea1a613
--- /dev/null
@@ -0,0 +1,111 @@
+--[[
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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.
+--]]
+
+-- Helper function to get a parameter's value in a URL
+function get_url_param( url, name )
+    return string.gsub( url, "^.*[&?]"..name.."=([^&]*).*$", "%1" )
+end
+
+function get_arturl( path, video_id )
+    if string.match( vlc.path, "iurl=" ) then
+        return vlc.decode_uri( get_url_param( vlc.path, "iurl" ) )
+    end
+    if not arturl then
+        return "http://img.youtube.com/vi/"..video_id.."/default.jpg"
+    end
+end
+
+-- Probe function.
+function probe()
+    if vlc.access ~= "http" then
+        return false
+    end
+    youtube_site = string.match( string.sub( vlc.path, 1, 8 ), "youtube" )
+    if not youtube_site then
+        -- FIXME we should be using a builtin list of known youtube websites
+        -- like "fr.youtube.com", "uk.youtube.com" etc..
+        youtube_site = string.find( vlc.path, ".youtube.com" )
+        if youtube_site == nil then
+            return false
+        end
+    end
+    return (  string.match( vlc.path, "watch%?v=" ) -- the html page
+            or string.match( vlc.path, "watch_fullscreen%?video_id=" ) -- the fullscreen page
+            or string.match( vlc.path, "p.swf" ) -- the (old?) player url
+            or string.match( vlc.path, "jp.swf" ) -- the (new?) player url (as of 24/08/2007)
+            or string.match( vlc.path, "player2.swf" ) ) -- another player url
+end
+
+-- Parse function.
+function parse()
+    if string.match( vlc.path, "watch%?v=" )
+    then -- This is the HTML page's URL
+        while true do
+            -- Try to find the video's title
+            line = vlc.readline()
+            if not line then break end
+            if string.match( line, "<meta name=\"title\"" ) then
+                name = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )
+            end
+            if string.match( line, "<meta name=\"description\"" ) then
+                description = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )
+            end
+            if string.match( line, "subscribe_to_user=" ) then
+                artist = string.gsub( line, ".*subscribe_to_user=([^&]*).*", "%1" )
+            end
+            -- OLD: var swfArgs = {hl:'en',BASE_YT_URL:'http://youtube.com/',video_id:'XPJ7d8dq0t8',l:'292',t:'OEgsToPDskLFdOYrrlDm3FQPoQBYaCP1',sk:'0gnr-AE6QZJEZmCMd3lq_AC'};
+            -- NEW: var swfArgs = { "BASE_YT_URL": "http://youtube.com", "video_id": "OHVvVmUNBFc", "l": 88, "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA", "tk": "mEL4E7PqHeaZp5OG19NQThHt9mXJU4PbRTOw6lz9osHi4Hixp7RE1w=="};
+            if string.match( line, "swfArgs" ) and string.match( line, "video_id" ) then
+                if string.match( line, "BASE_YT_URL" ) then
+                    base_yt_url = string.gsub( line, ".*\"BASE_YT_URL\": \"([^\"]*).*", "%1" )
+                end
+                t = string.gsub( line, ".*\"t\": \"([^\"]*).*", "%1" )
+                -- vlc.msg_err( t )
+                -- video_id = string.gsub( line, ".*&video_id:'([^']*)'.*", "%1" )
+            end
+            if name and description and artist --[[and video_id]] then break end
+        end
+        if not video_id then
+            video_id = get_url_param( vlc.path, "v" )
+        end
+        if not base_yt_url then
+            base_yt_url = "http://youtube.com/"
+        end
+        arturl = get_arturl( vlc.path, video_id )
+        if t then
+            return { { path = base_yt_url .. "get_video?video_id="..video_id.."&t="..t; name = name; description = description; artist = artist; arturl = arturl } }
+        else
+            -- This shouldn't happen ... but keep it as a backup.
+            return { { path = "http://www.youtube.com/v/"..video_id; name = name; description = description; artist = artist; arturl = arturl } }
+        end
+    else -- This is the flash player's URL
+        if string.match( vlc.path, "title=" ) then
+            name = get_url_param( vlc.path, "title" )
+        end
+        video_id = get_url_param( vlc.path, "video_id" )
+        arturl = get_arturl( vlc.path, video_id )
+        if not string.match( vlc.path, "t=" ) then
+            -- This sucks, we're missing "t" which is now mandatory. Let's
+            -- try using another url
+            return { { path = "http://www.youtube.com/v/"..video_id; name = name; arturl = arturl } }
+        end
+        return { { path = "http://www.youtube.com/get_video.php?video_id="..video_id.."&t="..get_url_param( vlc.path, "t" ); name = name; arturl = arturl } }
+    end
+end
diff --git a/share/lua/playlist/youtube_homepage.lua b/share/lua/playlist/youtube_homepage.lua
new file mode 100644 (file)
index 0000000..5c7e88a
--- /dev/null
@@ -0,0 +1,53 @@
+--[[
+  Parse YouTube homepage and browse pages. Next step is to recode firefox
+  in VLC ... using Lua of course ;)
+
+ $Id$
+
+ Copyright © 2007 the VideoLAN team
+
+ 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.
+--]]
+
+function probe()
+    return vlc.access == "http" and ( string.match( vlc.path, "youtube.com/%?$" ) or string.match( vlc.path, "youtube.com/browse" ) )
+end
+
+function parse()
+    p = {}
+    while true
+    do
+        line = vlc.readline()
+        if not line then break end
+        for _path, _artist, _name in string.gmatch( line, "href=\"(/watch%?v=[^\"]*)\" onclick=\"_hbLink%('([^']*)','Vid[^\']*'%);\">([^<]*)</a><br/>" )
+        do
+            path = "http://www.youtube.com" .. _path
+            name = vlc.resolve_xml_special_chars( _name )
+            artist = _artist
+        end
+        for _min, _sec in string.gmatch( line, "<span class=\"runtime\">(%d*):(%d*)</span>" )
+        do
+            duration = 60 * _min + _sec
+        end
+        if path and name and artist and duration then
+            table.insert( p, { path = path; name = name; artist = artist; duration = duration } )
+            path = nil
+            name = nil
+            artist = nil
+            duration = nil
+        end
+    end
+    return p
+end
diff --git a/share/luaintf/dummy.lua b/share/luaintf/dummy.lua
deleted file mode 100644 (file)
index 7193043..0000000
+++ /dev/null
@@ -1,12 +0,0 @@
---[[ This code is public domain (since it really isn't very interesting) ]]--
-
-msg = [[
-This is the `dummy' VLC Lua interface module.
-Please specify a VLC Lua interface to load with the --lua-intf option.
-VLC Lua interface modules include: `rc', `telnet' and `hotkeys'.
-For example: vlc -I lua --lua-intf rc]]
---You can also use the alternate syntax: vlc -I "lua{intf=rc}"]]
-
-for line in string.gmatch(msg,"([^\n]+)\n*") do
-    vlc.msg.err(line)
-end
diff --git a/share/luaintf/hotkeys.lua b/share/luaintf/hotkeys.lua
deleted file mode 100644 (file)
index 0b01cec..0000000
+++ /dev/null
@@ -1,119 +0,0 @@
---[==========================================================================[
- hotkeys.lua: hotkey handling for VLC
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
---[==========================================================================[
-    This is meant to replace modules/control/hotkeys.c
-    (which will require some changes in the VLC core hotkeys stuff)
---]==========================================================================]
-
-require("common")
---common.table_print(vlc,"vlc.\t")
-
-bindings = {
-    ["Ctrl-q"] = "quit",
-    ["Space"] = "play-pause",
-    [113] --[[q]] = "quit",
-    [119] --[[w]] = "demo",
-    [120] --[[x]] = "demo2",
-    }
-
-function quit()
-    print("Bye-bye!")
-    vlc.quit()
-end
-
-function demo()
-    vlc.osd.icon("speaker")
-end
-
-function demo2()
-    if not channel1 then
-        channel1 = vlc.osd.channel_register()
-        channel2 = vlc.osd.channel_register()
-    end
-    vlc.osd.message("Hey!",channel1)
-    vlc.osd.slider( 10, "horizontal", channel2 )
-end
-
-function action(func,delta)
-    return { func = func, delta = delta or 0, last = 0, times = 0 }
-end
-
-actions = {
-    ["quit"] = action(quit),
-    ["play-pause"] = action(play_pause),
-    ["demo"] = action(demo),
-    ["demo2"] = action(demo2),
-    }
-
-action = nil
-
-queue = {}
-
-function action_trigger( action )
-    print("action_trigger:",tostring(action))
-    local a = actions[action]
-    if a then
-        local date = vlc.mdate()
-        if a.delta and date > a.last + a.delta then
-            a.times = 0
-        else
-            a.times = a.times + 1
-        end
-        a.last = date
-        table.insert(queue,action)
-        vlc.signal()
-    else
-        vlc.msg_err("Key `"..key.."' points to unknown action `"..bindings[key].."'.")
-    end
-end
-
-function key_press( var, old, new, data )
-    local key = new
-    print("key_press:",tostring(key))
-    if bindings[key] then
-        action_trigger(bindings[key])
-    else
-        vlc.msg_err("Key `"..key.."' isn't bound to any action.")
-    end
-end
-
-vlc.var.add_callback( vlc.object.libvlc(), "key-pressed", key_press )
---vlc.var.add_callback( vlc.object.libvlc(), "action-triggered", action_trigger )
-
-while not die do
-    if #queue ~= 0 then
-        local action = actions[queue[1]]
-        local ok, msg = pcall( action.func )
-        if not ok then
-            vlc.msg.err("Error while executing action `"..queue[1].."': "..msg)
-        end
-        table.remove(queue,1)
-    else
-        die = vlc.lock_and_wait()
-    end
-end
-
--- Clean up
-vlc.var.del_callback( vlc.object.libvlc(), "key-pressed", key_press )
---vlc.var.del_callback( vlc.object.libvlc(), "action-triggered", action_trigger )
diff --git a/share/luaintf/http.lua b/share/luaintf/http.lua
deleted file mode 100644 (file)
index 1e6d775..0000000
+++ /dev/null
@@ -1,275 +0,0 @@
---[==========================================================================[
- http.lua: HTTP interface module for VLC
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
---[==========================================================================[
-Configuration options:
- * host: A host to listen on.
- * dir: Directory to use a the http interface's root.
- * no_error_detail: If set, do not print the Lua error message when generating
-                    a page fails.
- * no_index: If set, don't build directory indexes
---]==========================================================================]
-
-
-require "httpd"
-require "acl"
-require "common"
-
-vlc.msg.err("Lua HTTP interface")
-
-open_tag = "<?vlc"
-close_tag = "?>"
-
-function escape(s)
-    return (string.gsub(s,"([%^%$%%%.%[%]%*%+%-%?])","%%%1"))
-end
-
-function process_raw(filename)
-    local input = io.open(filename):read("*a")
-    -- find the longest [===[ or ]=====] type sequence and make sure that
-    -- we use one that's longer.
-    local str="X"
-    for str2 in string.gmatch(input,"[%[%]]=*[%[%]]") do
-        if #str < #str2 then str = str2 end
-    end
-    str=string.rep("=",#str-1)
-
-    --[[ FIXME:
-    <?xml version="1.0" encoding="charset" standalone="yes" ?> is still a problem. The closing '?>' needs to be printed using '?<?vlc print ">" ?>' to prevent a parse error.
-    --]]
-    local code0 = string.gsub(input,escape(close_tag)," print(["..str.."[")
-    local code1 = string.gsub(code0,escape(open_tag),"]"..str.."]) ")
-    local code = "print(["..str.."["..code1.."]"..str.."])"
-    --[[ Uncomment to debug
-    if string.match(filename,"vlm_cmd.xml$") then
-    io.write(code)
-    io.write("\n")
-    end
-    --]]
-    return assert(loadstring(code,filename))
-end
-function process(filename)
-    vlc.msg.dbg("Loading `"..filename.."'")
-    local mtime = 0 -- vlc.fd.stat(filename).modification_time
-    local func = false -- process_raw(filename)
-    return function(...)
-        local new_mtime = vlc.fd.stat(filename).modification_time
-        if new_mtime ~= mtime then
-            -- Re-read the file if it changed
-            vlc.msg.dbg("Reloading `"..filename.."'")
-            func = process_raw(filename)
-            mtime = new_mtime
-        end
-        return func(...)
-    end
-end
-
-
-function callback_error(path,url,msg)
-    local url = url or "&lt;page unknown&gt;"
-    return  [[<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Error loading ]]..url..[[</title>
-</head>
-<body>
-<h1>Error loading ]]..url..[[</h1><pre>]]..(config.no_error_detail and "Remove configuration option `no_error_detail' on the server to get more information." or tostring(msg))..[[</pre>
-<p>
-<a href="http://www.videolan.org/">VideoLAN</a><br/>
-<a href="http://www.lua.org/manual/5.1/">Lua 5.1 Reference Manual</a>
-</p>
-</body>
-</html>]]
-end
-
-function dirlisting(url,listing)
-    local list = {}
-    for _,f in ipairs(listing) do
-        if not string.match(f,"^%.") then
-            table.insert(list,"<li><a href='"..f.."'>"..f.."</a></li>")
-        end
-    end
-    list = table.concat(list)
-    local function callback()
-        return [[<html xmlns="http://www.w3.org/1999/xhtml">
-<head>
-<title>Directory listing ]]..url..[[</title>
-</head>
-<body>
-<h1>Directory listing ]]..url..[[</h1><ul>]]..list..[[</ul>
-</body>
-</html>]]
-    end
-    return h:file_new(url,"text/html",nil,nil,nil,callback,nil)
-end
-
-function file(h,path,url,acl_,mime)
-    local generate_page = process(path)
-    local callback = function(data,request)
-        -- FIXME: I'm sure that we could define a real sandbox
-        -- redefine print
-        local page = {}
-        local function pageprint(...)
-            for i=1,select("#",...) do
-                if i== 1 then
-                    table.insert(page,tostring(select(i,...)))
-                else
-                    table.insert(page," "..tostring(select(i,...)))
-                end
-            end
-        end
-        _G._GET = parse_url_request(request)
-        local oldprint = print
-        print = pageprint
-        local ok, msg = pcall(generate_page)
-        -- reset
-        print = oldprint
-        if not ok then
-            return callback_error(path,url,msg)
-        end
-        return table.concat(page)
-    end
-    return h:file_new(url or path,mime,nil,nil,acl_,callback,nil)
-end
-
-function rawfile(h,path,url,acl_)
-    local filename = path
-    vlc.msg.dbg("Loading `"..filename.."'")
-    local mtime = 0 -- vlc.fd.stat(filename).modification_time
-    local page = false -- io.open(filename):read("*a")
-    local callback = function(data,request)
-        local new_mtime = vlc.fd.stat(filename).modification_time
-        if mtime ~= new_mtime then
-            -- Re-read the file if it changed
-            vlc.msg.dbg("Reloading `"..filename.."'")
-            page = io.open(filename):read("*a")
-            mtime = new_mtime
-        end
-        return page
-    end
-    return h:file_new(url or path,nil,nil,nil,acl_,callback,nil)
-end
-
-function parse_url_request(request)
-    if not request then return {} end
-    t = {}
-    for k,v in string.gmatch(request,"([^=&]+)=?([^=&]*)") do
-        local k_ = vlc.decode_uri(k)
-        local v_ = vlc.decode_uri(v)
-        t[k_]=v_
-    end
-    return t
-end
-
-local function find_datadir(name)
-    local list = vlc.datadir_list(name)
-    for _, l in ipairs(list) do
-        local s = vlc.fd.stat(l)
-        if s then
-            return l
-        end
-    end
-    error("Unable to find the `"..name.."' directory.")
-end
-http_dir = config.dir or find_datadir("http-lua")
-
-do
-    local oldpath = package.path
-    package.path = http_dir.."/?.lua"
-    local ok, err = pcall(require,"custom")
-    if not ok then
-        vlc.msg.warn("Couldn't load "..http_dir.."/custom.lua")
-    else
-        vlc.msg.dbg("Loaded "..http_dir.."/custom.lua")
-    end
-    package.path = oldpath
-end
-local files = {}
-local mimes = {
-    txt = "text/plain",
-    html = "text/html",
-    xml = "text/xml",
-    js = "text/javascript",
-    png = "image/png",
-    ico = "image/x-icon",
-}
-local function load_dir(dir,root,parent_acl)
-    local root = root or "/"
-    local has_index = false
-    if string.match(dir,"/old") then
-        return
-    end
-    local my_acl = parent_acl
-    do
-        local af = dir.."/.hosts"
-        local s = vlc.fd.stat(af)
-        if s and s.type == "file" then
-            -- We found an acl
-            my_acl = acl.new(false)
-            my_acl:load_file(af)
-        end
-    end
-    local d = vlc.fd.opendir(dir)
-    for _,f in ipairs(d) do
-        if not string.match(f,"^%.") then
-            local s = vlc.fd.stat(dir.."/"..f)
-            if s.type == "file" then
-                local url
-                if f == "index.html" then
-                    url = root
-                    has_index = true
-                else
-                    url = root..f
-                end
-                local ext = string.match(f,"%.([^%.]-)$")
-                local mime = mimes[ext]
-                -- print(url,mime)
-                if mime and string.match(mime,"^text/") then
-                    table.insert(files,file(h,dir.."/"..f,url,my_acl and my_acl.private,mime))
-                else
-                    table.insert(files,rawfile(h,dir.."/"..f,url,my_acl and my_acl.private))
-                end
-            elseif s.type == "dir" then
-                if f == "dialogs" then -- FIXME
-                else
-                    load_dir(dir.."/"..f,root..f.."/",my_acl)
-                end
-            end
-        end
-    end
-    if not has_index and not config.no_index then
-        -- print("Adding index for", root)
-        table.insert(files,dirlisting(root,d,my_acl and my_acl.private))
-    end
-end
-
-local u = vlc.net.url_parse( config.host or "localhost:8080" )
-h = httpd.new(u.host,u.port)
-load_dir( http_dir )
-
-while not die do die = vlc.lock_and_wait() end -- everything happens in callbacks
-
--- FIXME: We shouldn't need to do this ourselves.
-for i=1,#files do
-    getmetatable(files[i]).__gc(files[i])
-    files[i] = nil
-end
diff --git a/share/luaintf/modules/acl.lua b/share/luaintf/modules/acl.lua
deleted file mode 100644 (file)
index d93f546..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
---[==========================================================================[
- acl.lua: VLC Lua interface ACL object
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
---[==========================================================================[
-require "acl"
-local a = acl.new(true) -> new ACL with default set to allow
-a:check("10.0.0.1") -> 0 == allow, 1 == deny, -1 == error
-a("10.0.0.1") -> same as a:check("10.0.0.1")
-a:duplicate() -> duplicate ACL object
-a:add_host("10.0.0.1",true) -> allow 10.0.0.1
-a:add_net("10.0.0.0",24,true) -> allow 10.0.0.0/24 (not sure)
-a:load_file("/path/to/acl") -> load ACL from file
---]==========================================================================]
-
-module("acl",package.seeall)
-
-methods = {
-    check = function(this,ip)
-        return vlc.acl.check(this.private,ip)
-    end,
-    duplicate = function(this)
-        return setmetatable({ private = vlc.acl.duplicate( rawget(this,"private") ) },metatable)
-    end,
-    add_host = function(this,ip,allow)
-        return vlc.acl.add_host(this.private,ip,allow)
-    end,
-    add_net = function(this,ip,len,allow)
-        return vlc.acl.add_net(this.private,ip,len,allow)
-    end,
-    load_file = function(this,path)
-        return vlc.acl.load_file(this.private,path)
-    end,
-}
-
-metatable = {
-    __index = function(this,key)
-        if methods[key] then
-            return methods[key]
-        elseif key == "private" then
-            error("Forbidden")
-        else
-            return rawget(this,key)
-        end
-    end,
-    __newindex = function(this,key,value)
-        if key == "private" or methods[key] then
-            error("Forbidden")
-        else
-            rawset(this,key,value)
-        end
-    end,
-    __call = methods.check,
-    __gc = function(this)
-        vlc.acl.delete(this.private)
-    end,
-    __metatable = "None of your business.",
-}
-
-function new( allow )
-    return setmetatable({ private = vlc.acl.create( allow ) },metatable)
-end
diff --git a/share/luaintf/modules/common.lua b/share/luaintf/modules/common.lua
deleted file mode 100644 (file)
index f0a1aa2..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
---[[ This code is public domain (since it really isn't very interesting) ]]--
-
-module("common",package.seeall)
-
--- Iterate over a table in the keys' alphabetical order
-function pairs_sorted(t)
-    local s = {}
-    for k,_ in pairs(t) do table.insert(s,k) end
-    table.sort(s)
-    local i = 0
-    return function () i = i + 1; return s[i], t[s[i]] end
-end
-
--- Return a function such as skip(foo)(a,b,c) = foo(b,c)
-function skip(foo)
-    return function(discard,...) return foo(...) end
-end
-
--- Return a function such as setarg(foo,a)(b,c) = foo(a,b,c)
-function setarg(foo,a)
-    return function(...) return foo(a,...) end
-end
-
--- Trigger a hotkey
-function hotkey(arg)
-    vlc.var.set( vlc.object.libvlc(), "key-pressed", vlc.config.get( arg ) )
-end
-
--- Take a video snapshot
-function snapshot()
-    local vout = vlc.object.find(nil,"vout","anywhere")
-    if not vout then return end
-    vlc.var.set(vout,"video-snapshot",nil)
-end
-
--- Naive (non recursive) table copy
-function table_copy(t)
-    c = {}
-    for i,v in pairs(t) do c[i]=v end
-    return c
-end
-
--- strip leading and trailing spaces
-function strip(str)
-    return string.gsub(str, "^%s*(.-)%s*$", "%1")
-end
-
--- print a table (recursively)
-function table_print(t,prefix)
-    local prefix = prefix or ""
-    for a,b in pairs_sorted(t) do
-        print(prefix..tostring(a),b)
-        if type(b)==type({}) then
-            table_print(b,prefix.."\t")
-        end
-    end
-end
-
--- print the list of callbacks registered in lua
--- usefull for debug purposes
-function print_callbacks()
-    print "callbacks:"
-    table_print(vlc.callbacks)
-end 
-
--- convert a duration (in seconds) to a string
-function durationtostring(duration)
-    return string.format("%02d:%02d:%02d",
-                         math.floor(duration/3600),
-                         math.floor(duration/60)%60,
-                         math.floor(duration%60))
-end
-
--- realpath
-function realpath(path)
-    return string.gsub(string.gsub(string.gsub(string.gsub(path,"/%.%./[^/]+","/"),"/[^/]+/%.%./","/"),"/%./","/"),"//","/")
-end
-
--- seek
-function seek(value)
-    local input = vlc.object.input()
-    if string.sub(value,#value)=="%" then
-        vlc.var.set(input,"position",tonumber(string.sub(value,1,#value-1))/100.)
-    else
-        vlc.var.set(input,"time",tonumber(value))
-    end
-end
diff --git a/share/luaintf/modules/host.lua b/share/luaintf/modules/host.lua
deleted file mode 100644 (file)
index 4d60ea6..0000000
+++ /dev/null
@@ -1,350 +0,0 @@
---[==========================================================================[
- host.lua: VLC Lua interface command line host module
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
---[==========================================================================[
-Example use:
-
-    require "host"
-    h = host.host()
-
-    -- Bypass any authentification
-    function on_password( client )
-        client:switch_status( host.status.read )
-    end
-    h.status_callbacks[host.status.password] = on_password
-
-    h:listen( "localhost:4212" )
-    h:listen( "*console" )
-    --or h:listen( { "localhost:4212", "*console" } )
-
-    -- The main loop
-    while not vlc.should_die() do
-        -- accept new connections
-        h:accept()
-
-        -- select active clients
-        local write, read = h:select( 0.1 ) -- 0.1 is a timeout in seconds
-
-        -- handle clients in write mode
-        for _, client in pairs(write) do
-            client:send()
-            client.buffer = ""
-            client:switch_status( host.status.read )
-        end
-
-        -- handle clients in read mode
-        for _, client in pairs(read) do
-            local str = client:recv(1000)
-            str = string.gsub(str,"\r?\n$","")
-            client.buffer = "Got `"..str.."'.\r\n"
-            client:switch_status( host.status.write )
-        end
-    end
-
-For complete examples see existing VLC Lua interface modules (ie telnet.lua)
---]==========================================================================]
-
-module("host",package.seeall)
-
-status = { init = 0, read = 1, write = 2, password = 3 }
-client_type = { net = 1, stdio = 2, fifo = 3 }
-
-function host()
-    -- private data
-    local clients = {}
-    local listeners = {}
-    local status_callbacks = {}
-
-    -- private methods
-    local function new_fd_set()
-        function foo_fds(foo)
-            return function(fd,...) return foo(fd.fds,...) end
-        end
-        return { -- data
-                 fds = vlc.fd.new_fd_set(),
-                 -- methods
-                 zero = foo_fds( vlc.fd.fd_zero ),
-                 set = foo_fds( vlc.fd.fd_set ),
-                 isset = foo_fds( vlc.fd.fd_isset ),
-                 clr = foo_fds( vlc.fd.fd_clr ),
-               }
-    end
-
-    -- private data
-    local fds_read = new_fd_set()
-    local fds_write = new_fd_set()
-
-    -- private methods
-    local function client_accept( clients, listen )
-        local wait
-        if #clients == 0 then
-            wait = -1
-        else
-            wait = 0
-        end
-        return vlc.net.accept( listen, wait )
-    end
-
-    local function fd_client( client )
-        if client.status == status.read then
-            return client.rfd
-        else -- status.write
-            return client.wfd
-        end
-    end
-
-    local function send( client, data, len )
-        if len then
-            return vlc.net.send( client.wfd, data, len )
-        else
-            return vlc.net.send( client.wfd, data or client.buffer )
-        end
-    end
-
-    local function recv( client, len )
-        if len then
-            return vlc.net.recv( client.rfd, len )
-        else
-            return vlc.net.recv( client.rfd )
-        end
-    end
-
-    local function write( client, data )
-        return vlc.fd.write( client.wfd, data or client.buffer )
-    end
-
-    local function read( client, len )
-        if len then
-            return vlc.fd.read( client.rfd, len )
-        else
-            return vlc.fd.read( client.rfd )
-        end
-    end
-
-    local function del_client( client )
-        if client.type == client_type.stdio then
-            client:send( "Cannot delete stdin/stdout client.\n" )
-            return
-        end
-        for i, c in pairs(clients) do
-            if c == client then
-                if client.type == client_type.net then
-                    if client.wfd ~= client.rfd then
-                        vlc.net.close( client.rfd )
-                    end
-                    vlc.net.close( client.wfd )
-                end
-                clients[i] = nil
-                return
-            end
-        end
-        vlc.msg.err("couldn't find client to remove.")
-    end
-    
-    local function switch_status( client, s )
-        if client.status == s then return end
-        client.status = s
-        if status_callbacks[s] then
-            status_callbacks[s]( client )
-        end
-    end
-
-    -- append a line to a client's (output) buffer
-    local function append( client, string )
-        client.buffer = client.buffer .. string .. "\r\n"
-    end
-
-    local function new_client( h, fd, wfd, t )
-        if fd < 0 then return end
-        local w, r
-        if t == client_type.net then
-            w = send
-            r = recv
-        else if t == client_type.stdio or t == client_type.fifo then
-            w = write
-            r = read
-        else
-            error("Unknown client type", t )
-        end end
-        local client = { -- data
-                         rfd = fd,
-                         wfd = wfd or fd,
-                         status = status.init,
-                         buffer = "",
-                         type = t,
-                         -- methods
-                         fd = fd_client,
-                         send = w,
-                         recv = r,
-                         del = del_client,
-                         switch_status = switch_status,
-                         append = append,
-                       }
-        client:send( "VLC media player "..vlc.version().."\n" )
-        table.insert(clients, client)
-        client:switch_status(status.password)
-    end
-
-    function filter_client( fd, status, status2 )
-        local l = 0
-        fd:zero()
-        for _, client in pairs(clients) do
-            if client.status == status or client.status == status2 then
-                fd:set( client:fd() )
-                l = math.max( l, client:fd() )
-            end
-        end
-        return l
-    end
-
-    -- public methods
-    local function _listen_tcp( h, host, port )
-        if listeners.tcp and listeners.tcp[host]
-                         and listeners.tcp[host][port] then
-            error("Already listening on tcp host `"..host..":"..tostring(port).."'")
-        end
-        if not listeners.tcp then
-            listeners.tcp = {}
-        end
-        if not listeners.tcp[host] then
-            listeners.tcp[host] = {}
-        end
-        local listener = vlc.net.listen_tcp( host, port )
-        listeners.tcp[host][port] = listener
-        if not listeners.tcp.list then
-            -- FIXME: if host == "list" we'll have a problem
-            listeners.tcp.list = {}
-            local m = { __mode = "v" } -- week values
-            setmetatable( listeners.tcp.list, m )
-        end
-        table.insert( listeners.tcp.list, listener )
-    end
-
-    local function _listen_stdio( h )
-        
-        if listeners.stdio then
-            error("Already listening on stdio")
-        end
-        new_client( h, 0, 1, client_type.stdio )
-        listeners.stdio = true
-    end
-
-    local function _listen( h, url )
-        if type(url)==type({}) then
-            for _,u in pairs(url) do
-                h:listen( u )
-            end
-        else
-            vlc.msg.info( "Listening on host \""..url.."\"." )
-            if url == "*console" then
-                h:listen_stdio()
-            else
-                u = vlc.net.url_parse( url )
-                h:listen_tcp( u.host, u.port )
-            end
-        end
-    end
-
-    local function _accept( h )
-        if listeners.tcp then
-            local wait
-            if #clients == 0 and not listeners.stdio and #listeners.tcp.list == 1 then
-                wait = -1 -- blocking
-            else
-                wait = 0
-            end
-            for _, listener in pairs(listeners.tcp.list) do
-                local fd = vlc.net.accept( listener, wait )
-                new_client( h, fd, fd, client_type.net )
-            end
-        end
-    end
-
-    local function _select( h, timeout )
-        local nfds = math.max( filter_client( fds_read, status.read, status.password ),
-                               filter_client( fds_write, status.write ) ) + 1
-        local ret = vlc.net.select( nfds, fds_read.fds, fds_write.fds,
-                                    timeout or 0.5 )
-        local wclients = {}
-        local rclients = {}
-        if ret > 0 then
-            for _, client in pairs(clients) do
-                if fds_write:isset( client:fd() ) then
-                    table.insert(wclients,client)
-                end
-                if fds_read:isset( client:fd() ) then
-                    table.insert(rclients,client)
-                end
-            end
-        end
-        return wclients, rclients
-    end
-
-    local function destructor( h )
-        print "destructor"
-        for _,client in pairs(clients) do
-            client:send("Shutting down.")
-            if client.type == client_type.tcp then
-                if client.wfd ~= client.rfd then
-                    vlc.net.close(client.rfd)
-                end
-                vlc.net.close(client.wfd)
-            end
-        end
-
-        if listeners.tcp then
-            for _, listener in pairs(listeners.tcp.list) do
-                vlc.net.listen_close( listener )
-            end
-        end
-    end
-
-    local function _broadcast( h, msg )
-        for _,client in pairs(clients) do
-            client:send( msg )
-        end
-    end
-
-    -- the instance
-    local h = { -- data
-                status_callbacks = status_callbacks,
-                -- methods
-                listen = _listen,
-                listen_tcp = _listen_tcp,
-                listen_stdio = _listen_stdio,
-                accept = _accept,
-                select = _select,
-                broadcast = _broadcast,
-              }
-
-    -- the metatable
-    local m = { -- data
-                __metatable = "Nothing to see here. Move along.",
-                -- methods
-                __gc = destructor,
-              }
-
-    setmetatable( h, m )
-
-    return h
-end
diff --git a/share/luaintf/modules/httpd.lua b/share/luaintf/modules/httpd.lua
deleted file mode 100644 (file)
index ff0ecb4..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
---[==========================================================================[
- httpd.lua: VLC Lua interface HTTPd module
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
---[==========================================================================[
---]==========================================================================]
-
-module("httpd",package.seeall)
-
-local function generic_metatable(methods,destructor)
-    return {
-        __index = function(this,key)
-            if methods and methods[key] then
-                return methods[key]
-            elseif key == "private" then
-                error("Forbidden")
-            else
-                return rawget(this,key)
-            end
-        end,
-        __newindex = function(this,key,value)
-            if key == "private" or (methods and methods[key]) then
-                error("Forbidden")
-            else
-                rawset(this,key,value)
-            end
-        end,
-        __gc = function(this)
-            if destructor then
-                destructor(rawget(this,"private"))
-            end
-        end,
-        --__metatable = "None of your business.",
-    }
-end
-
-local handler_metatable = generic_metatable({},vlc.httpd.handler_delete)
-local file_metatable = generic_metatable({},vlc.httpd.file_delete)
-local redirect_metatable = generic_metatable({},vlc.httpd.redirect_delete)
-
-local host_methods = {
-    handler_new = function(this,...)
-        return setmetatable({private=vlc.httpd.handler_new(rawget(this,"private"),...),parent=this},handler_metatable)
-    end,
-    file_new = function(this,...)
-        return setmetatable({private=vlc.httpd.file_new(rawget(this,"private"),...),parent=this},file_metatable)
-    end,
-    redirect_new = function(this,...)
-        return setmetatable({private=vlc.httpd.redirect_new(rawget(this,"private"),...),parent=this},redirect_metatable)
-    end,
-}
-local host_metatable = generic_metatable(host_methods,vlc.httpd.host_delete)
-
-function new( ... )
-    return setmetatable({private=vlc.httpd.host_new(...)},host_metatable)
-end
diff --git a/share/luaintf/modules/sandbox.lua b/share/luaintf/modules/sandbox.lua
deleted file mode 100644 (file)
index c85e483..0000000
+++ /dev/null
@@ -1,120 +0,0 @@
---[==========================================================================[
- sandbox.lua: Lua sandboxing facilities
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
-module("sandbox",package.seeall)
-
--- See Programming in Lua (second edition) for sandbox examples
--- See http://lua-users.org/wiki/SandBoxes for a list of SAFE/UNSAFE variables
-
-local sandbox_blacklist = {
-    collectgarbage = true,
-    dofile = true,
-    _G = true,
-    getfenv = true,
-    getmetatable = true,
-    load = true, -- Can be protected I guess
-    loadfile = true, -- Can be protected I guess
-    loadstring = true, -- Can be protected I guess
-    rawequal = true,
-    rawget = true,
-    rawset = true,
-    setfenv = true,
-    setmetatable = true,
-    module = true,
-    require = true,
-    package = true,
-    debug = true,
-}
-
-function readonly_table_proxy(name,src,blacklist)
-    if type(src)=="nil" then return end
-    if type(src)~="table" then error("2nd argument must be a table (or nil)") end
-    local name = name
-    local t = src
-    local blist = {}
-    if blacklist then
-        for _, v in pairs(blacklist) do
-            blist[v] = true
-        end
-    end
-    local metatable_readonly = {
-        __index = function(self,key)
-            if blist[key] then
-                error("Sandbox: Access to `"..name.."."..key.."' is forbidden.")
-            end
-            return t[key]
-        end,
-        __newindex = function(self,key,value)
-            error("It is forbidden to modify elements of this table.")
-        end,
-    }
-    return setmetatable({},metatable_readonly)
-end
-
--- Of course, all of this is useless if the sandbox calling code has
--- another reference to one of these tables in his global environement.
-local sandbox_proxy = {
-    coroutine   = readonly_table_proxy("coroutine",coroutine),
-    string      = readonly_table_proxy("string",string,{"dump"}),
-    table       = readonly_table_proxy("table",table),
-    math        = readonly_table_proxy("math",math),
-    io          = readonly_table_proxy("io",io),
-    os          = readonly_table_proxy("os",os,{"exit","getenv","remove",
-                                                "rename","setlocale"}),
-    sandbox     = readonly_table_proxy("sandbox",sandbox),
-}
-
-function sandbox(func,override)
-    local _G = getfenv(2)
-    local override = override or {}
-    local sandbox_metatable =
-    {
-        __index = function(self,key)
-            if override[key] then
-                return override[key]
-            end
-            if sandbox_blacklist[key] then
-                error( "Sandbox: Access to `"..key.."' is forbidden." )
-            end
-            --print(key,"not found in env. Looking in sandbox_proxy and _G")
-            local value = sandbox_proxy[key] or _G[key]
-            rawset(self,key,value) -- Keep a local copy
-            return value
-        end,
-        __newindex = function(self,key,value)
-            if override and override[key] then
-                error( "Sandbox: Variable `"..key.."' is read only." )
-            end
-            return rawset(self,key,value)
-        end,
-    }
-    local sandbox_env = setmetatable({},sandbox_metatable)
-    return function(...)
-        setfenv(func,sandbox_env)
-        local ret = {func(...)} -- Not perfect (if func returns nil before
-                                -- another return value) ... but it's better
-                                -- than nothing
-        setfenv(func,_G)
-        return unpack(ret)
-    end
-end
\ No newline at end of file
diff --git a/share/luaintf/rc.lua b/share/luaintf/rc.lua
deleted file mode 100644 (file)
index 17a6278..0000000
+++ /dev/null
@@ -1,638 +0,0 @@
---[==========================================================================[
- rc.lua: remote control module for VLC
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
-description=
-[============================================================================[
- Remote control interface for VLC
-
- This is a modules/control/rc.c look alike (with a bunch of new features)
- Use on local term:
-    vlc -I luarc
- Use on tcp connection:
-    vlc -I luarc --lua-config "rc={host='localhost:4212'}"
- Use on multiple hosts (term + 2 tcp ports):
-    vlc -I luarc --lua-config "rc={hosts={'*console','localhost:4212','localhost:5678'}}"
- Note:
-    -I luarc is an alias for -I lua --lua-intf rc
-
- Configuration options setable throught the --lua-config option are:
-    * hosts: A list of hosts to listen on.
-    * host: A host to listen on. (won't be used if `hosts' is set)
- The following can be set using the --lua-config option or in the interface
- itself using the `set' command:
-    * prompt: The prompt.
-    * welcome: The welcome message.
-    * width: The default terminal width (used to format text).
-    * autocompletion: When issuing an unknown command, print a list of
-                      possible commands to autocomplete with. (0 to disable,
-                      1 to enable).
-    * autoalias: If autocompletion returns only one possibility, use it
-                 (0 to disable, 1 to enable).
-    * flatplaylist: 0 to disable, 1 to enable.
-]============================================================================]
-
-require("common")
-skip = common.skip
-skip2 = function(foo) return skip(skip(foo)) end
-setarg = common.setarg
-strip = common.strip
-
---[[ Setup default environement ]]
-env = { prompt = "> ";
-        width = 70;
-        autocompletion = 1;
-        autoalias = 1;
-        welcome = "Remote control interface initialized. Type `help' for help.";
-        flatplaylist = 0;
-      }
-
---[[ Import custom environement variables from the command line config (if possible) ]]
-for k,v in pairs(env) do
-    if config[k] then
-        if type(env[k]) == type(config[k]) then
-            env[k] = config[k]
-            vlc.msg.dbg("set environement variable `"..k.."' to "..tonumber(env[k]))
-        else
-            vlc.msg.err("environement variable `"..k.."' should be of type "..type(env[k])..". config value will be discarded.")
-        end
-    end
-end
-
---[[ Command functions ]]
-function set_env(name,client,value)
-    if value then
-        local var,val = split_input(value)
-        if val then
-            s = string.gsub(val,"\"(.*)\"","%1")
-            if type(client.env[var])==type(1) then
-                client.env[var] = tonumber(s)
-            else
-                client.env[var] = s
-            end
-        else
-            client:append( tostring(client.env[var]) )
-        end
-    else
-        for e,v in common.pairs_sorted(client.env) do
-            client:append(e.."="..v)
-        end
-    end
-end
-
-function save_env(name,client,value)
-    env = common.table_copy(client.env)
-end
-
-function alias(client,value)
-    if value then
-        local var,val = split_input(value)
-        if commands[var] and type(commands[var]) ~= type("") then
-            client:append("Error: cannot use a primary command as an alias name")
-        else
-            if commands[val] then
-                commands[var]=val
-            else
-                client:append("Error: unknown primary command `"..val.."'.")
-            end
-        end
-    else
-        for c,v in common.pairs_sorted(commands) do
-            if type(v)==type("") then
-                client:append(c.."="..v)
-            end
-        end
-    end
-end
-
-function fixme(name,client)
-    client:append( "FIXME: unimplemented command `"..name.."'." )
-end
-
-function logout(name,client)
-    if client.type == host.client_type.net then
-        client:send("Bye-bye!")
-        client:del()
-    else
-        client:append("Error: Can't logout of stdin/stdout. Use quit or shutdown to close VLC.")
-    end
-end
-
-function shutdown(name,client)
-    client:append("Bye-bye!")
-    h:broadcast("Shutting down.")
-    vlc.msg.info("Requested shutdown.")
-    vlc.quit()
-end
-
-function quit(name,client)
-    if client.type == host.client_type.net then
-        logout(name,client)
-    else
-        shutdown(name,client)
-    end
-end
-
-function add(name,client,arg)
-    -- TODO: parse (and use) options
-    local f
-    if name == "enqueue" then
-        f = vlc.playlist.enqueue
-    else
-        f = vlc.playlist.add
-    end
-    f({{path=arg}})
-end
-
-function playlist_is_tree( client )
-    if client.env.flatplaylist == 0 then
-        return true
-    else
-        return false
-    end
-end
-
-function playlist(name,client,arg)
-    function playlist0(item,prefix)
-        local prefix = prefix or ""
-        if not item.flags.disabled then
-            local str = "| "..prefix..tostring(item.id).." - "..item.name
-            if item.duration > 0 then
-                str = str.." ("..common.durationtostring(item.duration)..")"
-            end
-            if item.nb_played > 0 then
-                str = str.." [played "..tostring(item.nb_played).." time"
-                if item.nb_played > 1 then
-                    str = str .. "s"
-                end
-                str = str .. "]"
-            end
-            client:append(str)
-        end
-        if item.children then
-            for _, c in ipairs(item.children) do
-                playlist0(c,prefix.."  ")
-            end
-        end
-    end
-    local playlist
-    local tree = playlist_is_tree(client)
-    if name == "search" then
-        playlist = vlc.playlist.search(arg or "", tree)
-    else
-        if tonumber(arg) then
-            playlist = vlc.playlist.get(tonumber(arg), tree)
-        elseif arg then
-            playlist = vlc.playlist.get(arg, tree)
-        else
-            playlist = vlc.playlist.get(nil, tree)
-        end
-    end
-    if name == "search" then
-        client:append("+----[ Search - "..(arg or "`reset'").." ]")
-    else
-        client:append("+----[ Playlist - "..playlist.name.." ]")
-    end
-    if playlist.children then
-        for _, item in ipairs(playlist.children) do
-            playlist0(item)
-        end
-    else
-        playlist0(playlist)
-    end
-    if name == "search" then
-        client:append("+----[ End of search - Use `search' to reset ]")
-    else
-        client:append("+----[ End of playlist ]")
-    end
-end
-
-function playlist_sort(name,client,arg)
-    if not arg then
-        client:append("Valid sort keys are: id, title, artist, genre, random, duration, album.")
-    else
-        local tree = playlist_is_tree(client)
-        vlc.playlist.sort(arg,false,tree)
-    end
-end
-
-function services_discovery(name,client,arg)
-    if arg then
-        if vlc.sd.is_loaded(arg) then
-            vlc.sd.remove(arg)
-            client:append(arg.." disabled.")
-        else
-            vlc.sd.add(arg)
-            client:append(arg.." enabled.")
-        end
-    else
-        local sd = vlc.sd.get_services_names()
-        client:append("+----[ Services discovery ]")
-        for n,ln in pairs(sd) do
-            local status
-            if vlc.sd.is_loaded(n) then
-                status = "enabled"
-            else
-                status = "disabled"
-            end
-            client:append("| "..n..": " .. ln .. " (" .. status .. ")")
-        end
-        client:append("+----[ End of services discovery ]")
-    end
-end
-
-function print_text(label,text)
-    return function(name,client)
-        client:append("+----[ "..label.." ]")
-        client:append "|"
-        for line in string.gmatch(text,".-\r?\n") do
-            client:append("| "..string.gsub(line,"\r?\n",""))
-        end
-        client:append "|"
-        client:append("+----[ End of "..string.lower(label).." ]")
-    end
-end
-
-function help(name,client,arg)
-    local width = client.env.width
-    local long = (name == "longhelp")
-    local extra = ""
-    if arg then extra = "matching `" .. arg .. "' " end
-    client:append("+----[ Remote control commands "..extra.."]")
-    for i, cmd in ipairs(commands_ordered) do
-        if (cmd == "" or not commands[cmd].adv or long)
-        and (not arg or string.match(cmd,arg)) then
-            local str = "| " .. cmd
-            if cmd ~= "" then
-                local val = commands[cmd]
-                if val.aliases then
-                    for _,a in ipairs(val.aliases) do
-                        str = str .. ", " .. a
-                    end
-                end
-                if val.args then str = str .. " " .. val.args end
-                if #str%2 == 1 then str = str .. " " end
-                str = str .. string.rep(" .",(width-(#str+#val.help)-1)/2)
-                str = str .. string.rep(" ",width-#str-#val.help) .. val.help
-            end
-            client:append(str)
-        end
-    end
-    client:append("+----[ end of help ]")
-end
-
-function input_info(name,client)
-    local categories = vlc.input_info()
-    for cat, infos in pairs(categories) do
-        client:append("+----[ "..cat.." ]")
-        client:append("|")
-        for name, value in pairs(infos) do
-            client:append("| "..name..": "..value)
-        end
-        client:append("|")
-    end
-    client:append("+----[ end of stream info ]")
-end
-
-function playlist_status(name,client)
-    local a,b,c = vlc.playlist.status()
-    client:append( "( new input: " .. tostring(a) .. " )" )
-    client:append( "( audio volume: " .. tostring(b) .. " )")
-    client:append( "( state " .. tostring(c) .. " )")
-end
-
-function is_playing(name,client)
-    if vlc.is_playing() then client:append "1" else client:append "0" end
-end
-
-function ret_print(foo,start,stop)
-    local start = start or ""
-    local stop = stop or ""
-    return function(discard,client,...) client:append(start..tostring(foo(...))..stop) end
-end
-
-function get_time(var,client)
-    return function()
-        local input = vlc.object.input()
-        client:append(math.floor(vlc.var.get( input, var )))
-    end
-end
-
-function titlechap(name,client,value)
-    local input = vlc.object.input()
-    local var = string.gsub( name, "_.*$", "" )
-    if value then
-        vlc.var.set( input, var, value )
-    else
-        local item = vlc.var.get( input, var )
-        -- Todo: add item name conversion
-        client:apped(item)
-    end
-end
-function titlechap_offset(client,offset)
-    return function(name,value)
-        local input = vlc.object.input()
-        local var = string.gsub( name, "_.*$", "" )
-        vlc.var.set( input, var, vlc.var.get( input, var )+offset )
-    end
-end
-
-function seek(name,client,value)
-    common.seek(value)
-end
-
-function volume(name,client,value)
-    if value then
-        vlc.volume.set(value)
-    else
-        client:append(tostring(vlc.volume.get()))
-    end
-end
-
-function rate(name,client)
-    local input = vlc.object.input()
-    if name == "normal" then
-        vlc.var.set(input,"rate",1000) -- FIXME: INPUT_RATE_DEFAULT
-    else
-        vlc.var.set(input,"rate-"..name,nil)
-    end
-end
-
-function listvalue(obj,var)
-    return function(client,value)
-        local o = vlc.object.find(nil,obj,"anywhere")
-        if not o then return end
-        if value then
-            vlc.var.set( o, var, value )
-        else
-            local c = vlc.var.get( o, var )
-            local v, l = vlc.var.get_list( o, var )
-            client:append("+----[ "..var.." ]")
-            for i,val in ipairs(v) do
-                local mark = (val==c)and " *" or ""
-                client:append("| "..tostring(val).." - "..tostring(l[i])..mark)
-            end
-            client:append("+----[ end of "..var.." ]")
-        end
-    end
-end
-
-function eval(client,val)
-    client:append(loadstring("return "..val)())
-end
-
---[[ Declare commands, register their callback functions and provide
-     help strings here.
-     Syntax is:
-     "<command name>"; { func = <function>; [ args = "<str>"; ] help = "<str>"; [ adv = <bool>; ] [ aliases = { ["<str>";]* }; ] }
-     ]]
-commands_ordered = {
-    { "add"; { func = add; args = "XYZ"; help = "add XYZ to playlist" } };
-    { "enqueue"; { func = add; args = "XYZ"; help = "queue XYZ to playlist" } };
-    { "playlist"; { func = playlist; help = "show items currently in playlist" } };
-    { "search"; { func = playlist; args = "[string]"; help = "search for items in playlist (or reset search)" } };
-    { "sort"; { func = playlist_sort; args = "key"; help = "sort the playlist" } };
-    { "sd"; { func = services_discovery; args = "[sd]"; help = "show services discovery or toggle" } };
-    { "play"; { func = skip2(vlc.playlist.play); help = "play stream" } };
-    { "stop"; { func = skip2(vlc.playlist.stop); help = "stop stream" } };
-    { "next"; { func = skip2(vlc.playlist.next); help = "next playlist item" } };
-    { "prev"; { func = skip2(vlc.playlist.prev); help = "previous playlist item" } };
-    { "goto"; { func = skip2(vlc.playlist.goto); help = "goto item at index" } };
-    { "repeat"; { func = skip2(vlc.playlist.repeat_); args = "[on|off]"; help = "toggle playlist repeat" } };
-    { "loop"; { func = skip2(vlc.playlist.loop); args = "[on|off]"; help = "toggle playlist loop" } };
-    { "random"; { func = skip2(vlc.playlist.random); args = "[on|off]"; help = "toggle playlist random" } };
-    { "clear"; { func = skip2(vlc.playlist.clear); help = "clear the playlist" } };
-    { "status"; { func = playlist_status; help = "current playlist status" } };
-    { "title"; { func = titlechap; args = "[X]"; help = "set/get title in current item" } };
-    { "title_n"; { func = titlechap_offset(1); help = "next title in current item" } };
-    { "title_p"; { func = titlechap_offset(-1); help = "previous title in current item" } };
-    { "chapter"; { func = titlechap; args = "[X]"; help = "set/get chapter in current item" } };
-    { "chapter_n"; { func = titlechap_offset(1); help = "next chapter in current item" } };
-    { "chapter_p"; { func = titlechap_offset(-1); help = "previous chapter in current item" } };
-    { "" };
-    { "seek"; { func = seek; args = "X"; help = "seek in seconds, for instance `seek 12'" } };
-    { "pause"; { func = setarg(common.hotkey,"key-play-pause"); help = "toggle pause" } };
-    { "fastforward"; { func = setarg(common.hotkey,"key-jump+extrashort"); help = "set to maximum rate" } };
-    { "rewind"; { func = setarg(common.hotkey,"key-jump-extrashort"); help = "set to minimum rate" } };
-    { "faster"; { func = rate; help = "faster playing of stream" } };
-    { "slower"; { func = rate; help = "slower playing of stream" } };
-    { "normal"; { func = rate; help = "normal playing of stream" } };
-    { "fullscreen"; { func = skip2(vlc.fullscreen); args = "[on|off]"; help = "toggle fullscreen"; aliases = { "f", "F" } } };
-    { "info"; { func = input_info; help = "information about the current stream" } };
-    { "get_time"; { func = get_time("time"); help = "seconds elapsed since stream's beginning" } };
-    { "is_playing"; { func = is_playing; help = "1 if a stream plays, 0 otherwise" } };
-    { "get_title"; { func = ret_print(vlc.get_title); help = "the title of the current stream" } };
-    { "get_length"; { func = get_time("length"); help = "the length of the current stream" } };
-    { "" };
-    { "volume"; { func = volume; args = "[X]"; help = "set/get audio volume" } };
-    { "volup"; { func = ret_print(vlc.volume.up,"( audio volume: "," )"); args = "[X]"; help = "raise audio volume X steps" } };
-    { "voldown"; { func = ret_print(vlc.volume.down,"( audio volume: "," )"); args = "[X]"; help = "lower audio volume X steps" } };
-    { "adev"; { func = skip(listvalue("aout","audio-device")); args = "[X]"; help = "set/get audio device" } };
-    { "achan"; { func = skip(listvalue("aout","audio-channels")); args = "[X]"; help = "set/get audio channels" } };
-    { "atrack"; { func = skip(listvalue("input","audio-es")); args = "[X]"; help = "set/get audio track" } };
-    { "vtrack"; { func = skip(listvalue("input","video-es")); args = "[X]"; help = "set/get video track" } };
-    { "vratio"; { func = skip(listvalue("vout","aspect-ratio")); args = "[X]"; help = "set/get video aspect ratio" } };
-    { "vcrop"; { func = skip(listvalue("vout","crop")); args = "[X]"; help = "set/get video crop"; aliases = { "crop" } } };
-    { "vzoom"; { func = skip(listvalue("vout","zoom")); args = "[X]"; help = "set/get video zoom"; aliases = { "zoom" } } };
-    { "snapshot"; { func = common.snapshot; help = "take video snapshot" } };
-    { "strack"; { func = skip(listvalue("input","spu-es")); args = "[X]"; help = "set/get subtitles track" } };
-    { "hotkey"; { func = skip(common.hotkey); args = "[hotkey name]"; help = "simulate hotkey press"; adv = true; aliases = { "key" } } };
-    { "menu"; { func = fixme; args = "[on|off|up|down|left|right|select]"; help = "use menu"; adv = true } };
-    { "" };
-    { "set"; { func = set_env; args = "[var [value]]"; help = "set/get env var"; adv = true } };
-    { "save_env"; { func = save_env; help = "save env vars (for future clients)"; adv = true } };
-    { "alias"; { func = skip(alias); args = "[cmd]"; help = "set/get command aliases"; adv = true } };
-    { "eval"; { func = skip(eval); help = "eval some lua (*debug*)"; adv =true } }; -- FIXME: comment out if you're not debugging
-    { "description"; { func = print_text("Description",description); help = "describe this module" } };
-    { "license"; { func = print_text("License message",vlc.license()); help = "print VLC's license message"; adv = true } };
-    { "help"; { func = help; args = "[pattern]"; help = "a help message"; aliases = { "?" } } };
-    { "longhelp"; { func = help; args = "[pattern]"; help = "a longer help message" } };
-    { "logout"; { func = logout; help = "exit (if in a socket connection)" } };
-    { "quit"; { func = quit; help = "quit VLC (or logout if in a socket connection)" } };
-    { "shutdown"; { func = shutdown; help = "shutdown VLC" } };
-    }
-commands = {}
-for i, cmd in ipairs( commands_ordered ) do
-    if #cmd == 2 then
-        commands[cmd[1]]=cmd[2]
-        if cmd[2].aliases then
-            for _,a in ipairs(cmd[2].aliases) do
-                commands[a]=cmd[1]
-            end
-        end
-    end
-    commands_ordered[i]=cmd[1]
-end
---[[ From now on commands_ordered is a list of the different command names
-     and commands is a associative array indexed by the command name. ]]
-
--- Compute the column width used when printing a the autocompletion list
-env.colwidth = 0
-for c,_ in pairs(commands) do
-    if #c > env.colwidth then env.colwidth = #c end
-end
-env.coldwidth = env.colwidth + 1
-
--- Count unimplemented functions
-do
-    local count = 0
-    local list = "("
-    for c,v in pairs(commands) do
-        if v.func == fixme then
-            count = count + 1
-            if count ~= 1 then
-                list = list..","
-            end
-            list = list..c
-        end
-    end
-    list = list..")"
-    if count ~= 0 then
-        env.welcome = env.welcome .. "\r\nWarning: "..count.." functions are still unimplemented "..list.."."
-    end
-end
-
---[[ Utils ]]
-function split_input(input)
-    local input = strip(input)
-    local s = string.find(input," ")
-    if s then
-        return string.sub(input,0,s-1), strip(string.sub(input,s))
-    else
-        return input
-    end
-end
-
-function call_command(cmd,client,arg)
-    if type(commands[cmd]) == type("") then
-        cmd = commands[cmd]
-    end
-    local ok, msg
-    if arg ~= nil then
-        ok, msg = pcall( commands[cmd].func, cmd, client, arg )
-    else
-        ok, msg = pcall( commands[cmd].func, cmd, client )
-    end
-    if not ok then
-        local a = arg or ""
-        if a ~= "" then a = " " .. a end
-        client:append("Error in `"..cmd..a.."' ".. msg)
-    end
-end
-
-function call_libvlc_command(cmd,client,arg)
-    local ok, vlcerr, vlcmsg = pcall( vlc.libvlc_command, cmd, arg )
-    if not ok then
-        local a = arg or ""
-        if a ~= "" then a = " " .. a end
-        client:append("Error in `"..cmd..a.."' ".. vlcerr) -- when pcall fails, the 2nd arg is the error message.
-    end
-    return vlcerr
-end
-
---[[ Setup host ]]
-require("host")
-h = host.host()
--- No auth
-h.status_callbacks[host.status.password] = function(client)
-    client.env = common.table_copy( env )
-    client:send( client.env.welcome .. "\r\n")
-    client:switch_status(host.status.read)
-end
--- Print prompt when switching a client's status to `read'
-h.status_callbacks[host.status.read] = function(client)
-    client:send( client.env.prompt )
-end
-
-h:listen( config.hosts or config.host or "*console" )
-
---[[ The main loop ]]
-while not vlc.should_die() do
-    h:accept()
-    local write, read = h:select(0.1)
-
-    for _, client in pairs(write) do
-        local len = client:send()
-        client.buffer = string.sub(client.buffer,len+1)
-        if client.buffer == "" then client:switch_status(host.status.read) end
-    end
-
-    for _, client in pairs(read) do
-        local input = client:recv(1000)
-        local done = false
-        if string.match(input,"\n$") then
-            client.buffer = string.gsub(client.buffer..input,"\r?\n$","")
-            done = true
-        elseif client.buffer == ""
-           and ((client.type == host.client_type.stdio and input == "")
-           or  (client.type == host.client_type.net and input == "\004")) then
-            -- Caught a ^D
-            client.buffer = "quit"
-            done = true
-        else
-            client.buffer = client.buffer .. input
-        end
-        if done then
-            local cmd,arg = split_input(client.buffer)
-            client.buffer = ""
-            client:switch_status(host.status.write)
-            if commands[cmd] then
-                call_command(cmd,client,arg)
-            else
-                if client.type == host.client_type.stdio 
-                and call_libvlc_command(cmd,client,arg) == 0 then
-                else
-                    local choices = {}
-                    if client.env.autocompletion ~= 0 then
-                        for v,_ in common.pairs_sorted(commands) do
-                            if string.sub(v,0,#cmd)==cmd then
-                                table.insert(choices, v)
-                            end
-                        end
-                    end
-                    if #choices == 1 and client.env.autoalias ~= 0 then
-                        -- client:append("Aliasing to \""..choices[1].."\".")
-                        cmd = choices[1]
-                        call_command(cmd,client,arg)
-                    else
-                        client:append("Unknown command `"..cmd.."'. Type `help' for help.")
-                        if #choices ~= 0 then
-                            client:append("Possible choices are:")
-                            local cols = math.floor(client.env.width/(client.env.colwidth+1))
-                            local fmt = "%-"..client.env.colwidth.."s"
-                            for i = 1, #choices do
-                                choices[i] = string.format(fmt,choices[i])
-                            end
-                            for i = 1, #choices, cols do
-                                local j = i + cols - 1
-                                if j > #choices then j = #choices end
-                                client:append("  "..table.concat(choices," ",i,j))
-                            end
-                        end
-                    end
-                end
-            end
-        end
-    end
-end
diff --git a/share/luaintf/telnet.lua b/share/luaintf/telnet.lua
deleted file mode 100644 (file)
index 1f40af0..0000000
+++ /dev/null
@@ -1,222 +0,0 @@
---[==========================================================================[
- telnet.lua: VLM interface plugin
---[==========================================================================[
- Copyright (C) 2007 the VideoLAN team
- $Id$
-
- Authors: Antoine Cellerier <dionoea at videolan dot 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.
---]==========================================================================]
-
-description=
-[============================================================================[
- VLM Interface plugin
-
- Copy (features wise) of the original VLC modules/control/telnet.c module.
-
- Differences are:
-    * it's in Lua
-    * 'lock' command to lock the telnet promt
-    * possibility to listen on different hosts including stdin
-      for example:
-        listen on stdin: vlc -I lua --lua-intf telnet --lua-config "telnet={host='*console'}"
-        listen on stdin + 2 ports on localhost: vlc -I lua --lua-intf telnet --lua-config "telnet={hosts={'localhost:4212','localhost:5678','*console'}}"
- Configuration options setable throught the --lua-config option are:
-    * hosts: A list of hosts to listen on (see examples above).
-    * host: A host to listen on. (won't be used if `hosts' is set)
-    * password: The password used for remote clients.
-    * prompt: The prompt.
-]============================================================================]
-
-require "host"
-
---[[ Some telnet command special characters ]]
-WILL = "\251" -- Indicates the desire to begin performing, or confirmation that you are now performing, the indicated option.
-WONT = "\252" -- Indicates the refusal to perform, or continue performing, the indicated option.
-DO   = "\253" -- Indicates the request that the other party perform, or confirmation that you are expecting the other party to perform, the indicated option.
-DONT = "\254" -- Indicates the demand that the other party stop performing, or confirmation that you are no longer expecting the other party to perform, the indicated option.
-IAC  = "\255" -- Interpret as command
-
-ECHO = "\001"
-
---[[ Client status change callbacks ]]
-function on_password( client )
-    if client.type == host.client_type.net then
-        client:send( "Password: " ..IAC..WILL..ECHO )
-    else
-        -- no authentification needed on stdin
-        client:switch_status( host.status.read )
-    end
-end
-function on_read( client )
-    client:send( config.prompt and tostring(config.prompt) or "> " )
-end
-function on_write( client )
-end
-
---[[ Misc functions ]]
-function telnet_commands( client )
-    -- remove telnet command replies from the client's data
-    client.buffer = string.gsub( client.buffer, IAC.."["..DO..DONT..WILL..WONT.."].", "" )
-end
-
-function vlm_message_to_string(client,message,prefix)
-    local prefix = prefix or ""
-    if message.value then
-        client:append(prefix .. message.name .. " : " .. message.value)
-        return
-    else
-        client:append(prefix .. message.name)
-        if message.children then
-            for i,c in ipairs(message.children) do
-                vlm_message_to_string(client,c,prefix.."    ")
-            end
-        end
-        return
-    end
-end
-
---[[ Configure the host ]]
-h = host.host()
-
-h.status_callbacks[host.status.password] = on_password
-h.status_callbacks[host.status.read] = on_read
-h.status_callbacks[host.status.write] = on_write
-
-h:listen( config.hosts or config.host or "localhost:4212" )
-password = config.password or "admin"
-
---[[ Launch vlm ]]
-vlm = vlc.vlm.new()
-
---[[ Commands ]]
-function shutdown(client)
-    h:broadcast("Shutting down.\r\n")
-    vlc.msg.err("shutdown requested")
-    vlc.quit()
-    return true
-end
-function logout(client)
-    client:del()
-    return true
-end
-function quit(client)
-    if client.type == host.client_type.net then
-        return logout(client)
-    else
-        return shutdown(client)
-    end
-end
-function lock(client)
-    client:send("\r\n")
-    client:switch_status( host.status.password )
-    client.buffer = ""
-    return false
-end
-function print_text(text)
-    return function(client)
-        client:append(string.gsub(text,"\r?\n","\r\n"))
-        return true
-    end
-end
-function help(client)
-    client:append("    Telnet Specific Commands:")
-    for c,t in pairs(commands) do
-        client:append("        "..c.." : "..t.help)
-    end
-    return true
-end
-commands = {
-    ["shutdown"]    = { func = shutdown, help = "shutdown VLC" },
-    ["quit"]        = { func = quit, help = "logout from telnet/shutdown VLC from local shell" },
-    ["logout"]      = { func = logout, help = "logout" },
-    ["lock"]        = { func = lock, help = "lock the telnet prompt" },
-    ["description"] = { func = print_text(description), help = "describe this module" },
-    ["license"]     = { func = print_text(vlc.license()), help = "print VLC's license message" },
-    ["help"]        = { func = help, help = "show this help", dovlm = true },
-    }
-
-function client_command( client )
-    local cmd = client.buffer
-    client.buffer = ""
-    if not commands[cmd] or not commands[cmd].func or commands[cmd].dovlm then
-        -- if it's not an interface specific command, it has to be a VLM command
-        local message, vlc_err = vlc.vlm.execute_command( vlm, cmd )
-        vlm_message_to_string( client, message )
-        if not commands[cmd] or not commands[cmd].func and not commands[cmd].dovlm then
-            if vlc_err ~= 0 then client:append( "Type `help' for help." ) end
-            return true
-        end
-    end
-    ok, msg = pcall( commands[cmd].func, client )
-    if not ok then
-        client:append( "Error in `"..cmd.."' "..msg )
-        return true
-    end
-    return msg
-end
-
---[[ The main loop ]]
-while not vlc.should_die() do
-    h:accept()
-    local w, r = h:select( 0.1 )
-
-    -- Handle writes
-    for _, client in pairs(w) do
-        local len = client:send()
-        client.buffer = string.sub(client.buffer,len+1)
-        if client.buffer == "" then client:switch_status( host.status.read ) end
-    end
-
-    -- Handle reads
-    for _, client in pairs(r) do
-        local str = client:recv(1000)
-        local done = false
-        if string.match(str,"\n$") then
-            client.buffer = string.gsub(client.buffer..str,"\r?\n$","")
-            done = true
-        elseif client.buffer == ""
-           and ((client.type == host.client_type.stdio and str == "")
-           or  (client.type == host.client_type.net and str == "\004")) then
-            -- Caught a ^D
-            client.buffer = "quit"
-            done = true
-        else
-            client.buffer = client.buffer .. str
-        end
-        if client.type == host.client_type.net then
-            telnet_commands( client )
-        end
-        if done then
-            if client.status == host.status.password then
-                if client.buffer == password then
-                    client:send( IAC..WONT..ECHO.."\r\nWelcome, Master\r\n" )
-                    client.buffer = ""
-                    client:switch_status( host.status.write )
-                else
-                    client:send( "\r\nWrong password\r\nPassword: " )
-                    client.buffer = ""
-                end
-            elseif client_command( client ) then
-                client:switch_status( host.status.write )
-            end
-        end
-    end
-end
-
---[[ Clean up ]]
-vlc.vlm.delete( vlm )
diff --git a/share/luameta/README.txt b/share/luameta/README.txt
deleted file mode 100644 (file)
index 351f7e5..0000000
+++ /dev/null
@@ -1,56 +0,0 @@
-Instructions to code your own VLC Lua meta script.
-$Id$
-
-Examples: See googleimage.lua .
-
-VLC Lua meta modules should define one of the following functions:
- * fetch_art(): returns a path to an artwork for the given item
- * fetch_meta(): returns a table with the following items:
-                .path: the item's full path / URL
-                .name: the item's name in playlist (OPTIONAL)
-                .title: the item's Title (OPTIONAL, meta data)
-                .artist: the item's Artist (OPTIONAL, meta data)
-                .genre: the item's Genre (OPTIONAL, meta data)
-                .copyright: the item's Copyright (OPTIONAL, meta data)
-                .album: the item's Album (OPTIONAL, meta data)
-                .tracknum: the item's Tracknum (OPTIONAL, meta data)
-                .description: the item's Description (OPTIONAL, meta data)
-                .rating: the item's Rating (OPTIONAL, meta data)
-                .date: the item's Date (OPTIONAL, meta data)
-                .setting: the item's Setting (OPTIONAL, meta data)
-                .url: the item's URL (OPTIONAL, meta data)
-                .language: the item's Language (OPTIONAL, meta data)
-                .nowplaying: the item's NowPlaying (OPTIONAL, meta data)
-                .publisher: the item's Publisher (OPTIONAL, meta data)
-                .encodedby: the item's EncodedBy (OPTIONAL, meta data)
-                .arturl: the item's ArtURL (OPTIONAL, meta data)
-                .trackid: the item's TrackID (OPTIONAL, meta data)
-                .options: a list of VLC options (OPTIONAL)
-                          example: .options = { "fullscreen" }
-                .duration: stream duration in seconds (OPTIONAL)
-                .meta: custom meta data (OPTIONAL, meta data)
-                       A .meta field is a table of custom meta categories which
-                       each have custom meta properties.
-                       example: .meta = { ["Google video"] = { ["docid"] = "-5784010886294950089"; ["GVP version"] = "1.1" }; ["misc"] = { "Hello" = "World!" } }
-            Invalid playlist items will be discarded by VLC.
-
-VLC defines a global vlc object with the following members:
- * vlc.stream_new
- * vlc.stream_delete
- * vlc.stream_readline
- * vlc.stream_read
- * vlc.decode_uri( <string> ): decode %xy characters in a string.
- * vlc.resolve_xml_special_chars( <string> ): decode &abc; characters in a
-                                             string.
- * vlc.msg_dbg( <string> ): print a debug message.
- * vlc.msg_warn( <string> ): print a warning message.
- * vlc.msg_err( <string> ): print an error message.
- * vlc.msg_info( <string> ): print an info message.
-
-Lua scripts are tried in alphabetical order in the user's VLC config
-director luameta/ subdirectory, then in the global VLC luameta/
-directory.
-
-Lua documentation is available on http://www.lua.org .
-VLC uses Lua 5.1
-All the Lua standard libraries are available.
diff --git a/share/luameta/googleimage.lua b/share/luameta/googleimage.lua
deleted file mode 100644 (file)
index 6bc7456..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---[[
- Gets an artwork from images.google.com
-
- $Id$
- Copyright © 2007 the VideoLAN team
-
- 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.
---]]
-
--- Replace non alphanumeric char by +
-function get_query( title )
-    -- If we have a .EXT remove the extension.
-    str = string.gsub( title, "(.*)%....$", "%1" )
-    return string.gsub( str, "([^%w ])",
-         function (c) return string.format ("%%%02X", string.byte(c)) end)
-end
-
--- Return the artwork
-function fetch_art()
-    if vlc.artist and vlc.album then
-        title = vlc.artist.." "..vlc.album
-    elseif vlc.title and vlc.artist then
-        title = vlc.artist.." "..vlc.title
-    elseif vlc.title then
-        title = vlc.title
-    elseif vlc.name then
-        title = vlc.name
-    else
-        return nil
-    end
-    fd = vlc.stream_new( "http://images.google.com/images?q=" .. get_query( title ) )
-    page = vlc.stream_read( fd, 65653 )
-    vlc.stream_delete( fd )
-    _, _, arturl = string.find( page, "imgurl=([^&]+)" )
-    if arturl then
-        return vlc.decode_uri(arturl)
-    else
-        return nil
-    end
-end
diff --git a/share/luaplaylist/README.txt b/share/luaplaylist/README.txt
deleted file mode 100644 (file)
index c6c3b59..0000000
+++ /dev/null
@@ -1,62 +0,0 @@
-Instructions to code your own VLC Lua playlist script.
-$Id$
-
-Examples: See dailymotion.lua, googlevideo.lua, metacafe.lua, youbtube.lua
-          and youtube_homepage.lua .
-
-VLC Lua playlist modules should define two functions:
- * probe(): returns true if we want to handle the playlist in this script
- * parse(): read the incoming data and return playlist item(s)
-            The playlist is a table of playlist objects.
-            A playlist object has the following members:
-                .path: the item's full path / URL
-                .name: the item's name in playlist (OPTIONAL)
-                .title: the item's Title (OPTIONAL, meta data)
-                .artist: the item's Artist (OPTIONAL, meta data)
-                .genre: the item's Genre (OPTIONAL, meta data)
-                .copyright: the item's Copyright (OPTIONAL, meta data)
-                .album: the item's Album (OPTIONAL, meta data)
-                .tracknum: the item's Tracknum (OPTIONAL, meta data)
-                .description: the item's Description (OPTIONAL, meta data)
-                .rating: the item's Rating (OPTIONAL, meta data)
-                .date: the item's Date (OPTIONAL, meta data)
-                .setting: the item's Setting (OPTIONAL, meta data)
-                .url: the item's URL (OPTIONAL, meta data)
-                .language: the item's Language (OPTIONAL, meta data)
-                .nowplaying: the item's NowPlaying (OPTIONAL, meta data)
-                .publisher: the item's Publisher (OPTIONAL, meta data)
-                .encodedby: the item's EncodedBy (OPTIONAL, meta data)
-                .arturl: the item's ArtURL (OPTIONAL, meta data)
-                .trackid: the item's TrackID (OPTIONAL, meta data)
-                .options: a list of VLC options (OPTIONAL)
-                          example: .options = { "fullscreen" }
-                .duration: stream duration in seconds (OPTIONAL)
-                .meta: custom meta data (OPTIONAL, meta data)
-                       A .meta field is a table of custom meta categories which
-                       each have custom meta properties.
-                       example: .meta = { ["Google video"] = { ["docid"] = "-5784010886294950089"; ["GVP version"] = "1.1" }; ["misc"] = { "Hello" = "World!" } }
-            Invalid playlist items will be discarded by VLC.
-
-VLC defines a global vlc object with the following members:
- * vlc.path: the URL string (without the leading http:// or file:// element)
- * vlc.access: the access used ("http" for http://, "file" for file://, etc.)
- * vlc.peek( <int> ): return the first <int> characters from the playlist file.
- * vlc.read( <int> ): read <int> characters from the playlist file.
-                      THIS FUNCTION CANNOT BE USED IN peek().
- * vlc.readline(): return a new line of playlist data on each call.
-                   THIS FUNCTION CANNOT BE USED IN peek().
- * vlc.decode_uri( <string> ): decode %xy characters in a string.
- * vlc.resolve_xml_special_chars( <string> ): decode &abc; characters in a
-                                             string.
- * vlc.msg_dbg( <string> ): print a debug message.
- * vlc.msg_warn( <string> ): print a warning message.
- * vlc.msg_err( <string> ): print an error message.
- * vlc.msg_info( <string> ): print an info message.
-
-Lua scripts are tried in alphabetical order in the user's VLC config
-director luaplaylist/ subdirectory, then in the global VLC luaplaylist/
-directory.
-
-Lua documentation is available on http://www.lua.org .
-VLC uses Lua 5.1
-All the Lua standard libraries are available.
diff --git a/share/luaplaylist/appletrailers.lua b/share/luaplaylist/appletrailers.lua
deleted file mode 100644 (file)
index 5a754ae..0000000
+++ /dev/null
@@ -1,65 +0,0 @@
---[[
-   Translate trailers.apple.com video webpages URLs to the corresponding
-   movie URL
-
- $Id$
- Copyright © 2007 the VideoLAN team
-
- 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, "trailers.apple.com" ) 
-end
-
--- Parse function.
-function parse()
-    p = {}
-    while true
-    do 
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "http://movies.apple.com/movies/.*%.mov" )
-        or string.match( line, "http://images.apple.com/movies/.*%.mov" )
-        then
-            if string.match( line, "http://movies.apple.com/movies/.*%.mov" ) then
-                path = vlc.decode_uri( string.gsub( line, "^.*(http://movies.apple.com/movies/.*%.mov).*$", "%1" ) )
-            elseif string.match( line, "http://images.apple.com/movies/.*%.mov" ) then
-                path = vlc.decode_uri( string.gsub( line, "^.*(http://images.apple.com/movies/.*%.mov).*$", "%1" ) )
-            end
-            if string.match( path, "480p" ) then
-                extraname = " (480p)"
-            elseif string.match( path, "720p" ) then
-                extraname = " (720p)"
-            elseif string.match( path, "1080p" ) then
-                extraname = " (1080p)"
-            else
-                extraname = ""
-            end
-            table.insert( p, { path = path; name = title..extraname; description = description; url = vlc.path } )
-        end
-        if string.match( line, "<title>" )
-        then
-            title = vlc.decode_uri( string.gsub( line, "^.*<title>([^<]*).*$", "%1" ) )
-        end
-        if string.match( line, "<meta name=\"Description\"" )
-        then
-            description = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"Description\" content=\"([^\"]*)\".*$", "%1" ) )
-        end
-    end
-    return p
-end
diff --git a/share/luaplaylist/break.lua b/share/luaplaylist/break.lua
deleted file mode 100644 (file)
index 1c18a0c..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---[[
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "www.break.com" ) 
-end
-
--- Parse function.
-function parse()
-    filepath = ""
-    filename = ""
-    filetitle = ""
-    arturl = ""
-    while true do
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "sGlobalContentFilePath=" ) then
-            filepath= string.gsub( line, ".*sGlobalContentFilePath='([^']*).*", "%1" )
-        end
-        if string.match( line, "sGlobalFileName=" ) then
-            filename = string.gsub( line, ".*sGlobalFileName='([^']*).*", "%1")
-        end
-        if string.match( line, "sGlobalContentTitle=" ) then
-            filetitle = string.gsub( line, ".*sGlobalContentTitle='([^']*).*", "%1")
-        end
-        if string.match( line, "el=\"videothumbnail\" href=\"" ) then
-            arturl = string.gsub( line, ".*el=\"videothumbnail\" href=\"([^\"]*).*", "%1" )
-        end
-        if string.match( line, "videoPath" ) then
-            return { { path = ( string.gsub( line, ".*videoPath', '([^']*).*", "%1" ) )..filepath.."/"..filename..".flv"; title = filetitle; arturl = arturl } }
-        end
-    end
-end
diff --git a/share/luaplaylist/canalplus.lua b/share/luaplaylist/canalplus.lua
deleted file mode 100644 (file)
index a83ad92..0000000
+++ /dev/null
@@ -1,87 +0,0 @@
---[[
- $Id: $
-
- Copyright © 2007 the VideoLAN team
-
- 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, "www.canalplus.fr" )
-end
-
--- Parse function.
-function parse()
-    p = {}
-    --vlc.msg_dbg( vlc.path )
-    if string.match( vlc.path, "www.canalplus.fr/index.php%?pid=" )
-    then -- This is the HTML page's URL
-        local id, name, description, arturl
-        while true do
-            -- Try to find the video's title
-            local line = vlc.readline()
-            if not line then break end
-            -- vlc.msg_dbg( line )
-            if string.match( line, "aVideos" ) then
-                if string.match( line, "CONTENT_ID.*=" ) then
-                    id = string.gsub( line, "^.*\"(.-)\".*$", "%1" )
-                elseif string.match( line, "CONTENT_VNC_TITRE" ) then
-                    arturl = string.gsub( line, "^.*src=\"(.-)\".*$", "%1" )
-                    name = string.gsub( line, "^.*alt=\"(.-)\".*$", "%1" )
-                elseif string.match( line, "CONTENT_VNC_DESCRIPTION" ) then
-                    description = string.gsub( line, "^.*\"(.-)\".*$", "%1" )
-                end
-                if id and string.match( line, "new Array" ) then
-                    add_item( p, id, name, description, arturl )
-                    id = nil
-                    name = nil
-                    arturl = nil
-                    description = nil
-                end
-            end
-        end
-        if id then
-            add_item( p, id, name, description, arturl )
-        end
-        return p
-    elseif string.match( vlc.path, "embed%-video%-player" ) then
-        while true do
-            local line = vlc.readline()
-            if not line then break end
-            --vlc.msg_dbg( line )
-            if string.match( line, "<hi>" ) then
-                local path = string.gsub( line, "^.*%[(.-)%].*$", "%1" )
-                vlc.msg_err("Path is: " .. tostring( path ) )
-                return { { path = path } }
-            end
-        end
-    end
-end
-
-function get_url_param( url, name )
-    return string.gsub( url, "^.*[&?]"..name.."=([^&]*).*$", "%1" )
-end
-
-function add_item( p, id, name, description, arturl )
-    --[[vlc.msg_dbg( "id: " .. tostring(id) )
-    vlc.msg_dbg( "name: " .. tostring(name) )
-    vlc.msg_dbg( "arturl: " .. tostring(arturl) )
-    vlc.msg_dbg( "description: " .. tostring(description) )
-    --]]
-    --local path = "http://www.canalplus.fr/flash/xml/configuration/configuration-embed-video-player.php?xmlParam="..id.."-"..get_url_param(vlc.path,"pid")
-    local path = "http://www.canalplus.fr/flash/xml/module/embed-video-player/embed-video-player.php?video_id="..id.."&pid="..get_url_param(vlc.path,"pid")
-    table.insert( p, { path = path; name = name; description = description; arturl = arturl } )
-end
diff --git a/share/luaplaylist/dailymotion.lua b/share/luaplaylist/dailymotion.lua
deleted file mode 100644 (file)
index 2cbae59..0000000
+++ /dev/null
@@ -1,81 +0,0 @@
---[[
-    Translate Daily Motion video webpages URLs to the corresponding
-    FLV URL.
-
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "dailymotion.com" ) 
-        and string.match( vlc.peek( 256 ), "<!DOCTYPE.*<title>Video " )
-end
-
--- Parse function.
-function parse()
-    while true
-    do 
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "param name=\"flashvars\" value=\".*video=" )
-        then
-            arturl = vlc.decode_uri( string.gsub( line, "^.*param name=\"flashvars\" value=\".*preview=([^&]*).*$", "%1" ) )
-            videos = vlc.decode_uri( string.gsub( line, "^.*param name=\"flashvars\" value=\".*video=([^&]*).*$", "%1" ) )
-       --[[ we get a list of different streams available, at various codecs
-            and resolutions:
-            /A@@spark||/B@@spark-mini||/C@@vp6-hd||/D@@vp6||/E@@h264
-            Not everybody can decode HD, not everybody has a 80x60 screen,
-            H264/MP4 is buggy , so i choose VP6 as the highest priority
-
-            Ideally, VLC would propose the different streams available, codecs
-            and resolutions (the resolutions are part of the URL)
-
-            For now we just built a list of preferred codecs : lowest value
-            means highest priority
-         ]]
-            local pref = { ["vp6"]=0, ["spark"]=1, ["h264"]=2, ["vp6-hd"]=3, ["spark-mini"]=4 }
-            local available = {}
-            for n in string.gmatch(videos, "[^|]+") do
-                i = string.find(n, "@@")
-                if i then
-                    available[string.sub(n, i+2)] = string.sub(n, 0, i-1)
-                end
-            end
-            local score = 666
-            local bestcodec
-            for codec,_ in pairs(available) do
-                if pref[codec] < score then
-                    bestcodec = codec
-                    score = pref[codec]
-                end
-            end
-            if bestcodec then
-                path = "http://dailymotion.com" .. available[bestcodec]
-            end
-        end
-        if string.match( line, "<meta name=\"description\"" )
-        then
-            name = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"description\" content=\"%w+ (.*) %w+ %w+ %w+ %w+ Videos\..*$", "%1" ) )
-            description = vlc.resolve_xml_special_chars( string.gsub( line, "^.*name=\"description\" content=\"%w+ .* %w+ %w+ %w+ %w+ Videos\. ([^\"]*)\".*$", "%1" ) )
-        end
-        if path and name and description and arturl then break end
-    end
-    return { { path = path; name = name; description = description; url = vlc.path; arturl = arturl } }
-end
diff --git a/share/luaplaylist/googlevideo.lua b/share/luaplaylist/googlevideo.lua
deleted file mode 100644 (file)
index 57cc281..0000000
+++ /dev/null
@@ -1,43 +0,0 @@
---[[
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "video.google.com" ) 
-        and string.match( vlc.path, "videoplay" )
-end
-
--- Parse function.
-function parse()
-    while true
-    do
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "^<title>" ) then
-            title = string.gsub( line, "<title>([^<]*).*", "%1" )
-        end
-        if string.match( line, "src=\"/googleplayer.swf" ) then
-            url = string.gsub( line, ".*videoUrl=([^&]*).*" ,"%1" )
-            arturl = string.gsub( line, ".*thumbnailUrl=([^\"]*).*", "%1" )
-            return { { path = vlc.decode_uri(url), title = title, arturl = vlc.decode_uri(arturl) } }
-        end
-    end
-end
diff --git a/share/luaplaylist/joox.lua b/share/luaplaylist/joox.lua
deleted file mode 100644 (file)
index 9ce15cd..0000000
+++ /dev/null
@@ -1,45 +0,0 @@
---[[
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "joox.net" ) or
-            string.match( vlc.path, "/iframe.php%?video=1&" )
-end
-
--- Parse function.
-function parse()
-    vidtitle = ""
-    while true do
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "iframe" ) then
-            -- extract the iframe
-            print((string.gsub( line, ".*iframe src=\"([^\"]*).*", "%1" ) ))
-            return { { path = (string.gsub( line, ".*iframe src=\"([^\"]*).*", "%1" )) } }
-        end
-        if string.match( line, "<param name=\"src" ) then
-            -- extract the video url from the iframe
-            print( (string.gsub( line, ".*src\" value=\"([^\"]*).*", "%1" )))
-            return { { path = (string.gsub( line, ".*src\" value=\"([^\"]*).*", "%1" )) } }
-        end
-    end
-end
diff --git a/share/luaplaylist/lelombrik.lua b/share/luaplaylist/lelombrik.lua
deleted file mode 100644 (file)
index 82fb472..0000000
+++ /dev/null
@@ -1,46 +0,0 @@
---[[
- French humor site: http://lelombrik.net
-
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "lelombrik.net/videos" ) 
-end
-
--- Parse function.
-function parse()
-    vidtitle = ""
-    while true do
-        line = vlc.readline()
-        if not line then break end
-        if string.match( line, "id=\"nom_fichier\">" ) then
-            vidtitle = string.gsub( line, ".*\"nom_fichier\">([^<]*).*", "%1" )
-        end
-        if string.match( line, "flvplayer.swf" ) then
-            -- fallback: retrieve the title from the url if we didn't find it
-            if vidtitle == "" then
-                vidtitle = string.gsub( vlc.path, ".*/([^.]*).*", "%1" )
-            end
-            return { { path = string.gsub( line, ".*flashvars=\"&file=([^&]*).*", "%1" ); arturl = string.gsub( line, ".*&image=([^&]*).*", "%1" ); title = vidtitle } }
-        end
-    end
-end
diff --git a/share/luaplaylist/megavideo.lua b/share/luaplaylist/megavideo.lua
deleted file mode 100644 (file)
index 44a04f2..0000000
+++ /dev/null
@@ -1,76 +0,0 @@
---[[
-    Translate MegaVideo video webpages URLs to the corresponding FLV URL.
-
- $Id$
-
- Copyright © 2008 the VideoLAN team
-
- 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, "megavideo.com" ) 
-end
-
--- Parse function.
-function parse()
-
-    -- we have to get the xml
-    if string.match( vlc.path, "www.megavideo.com.*&v=.*&u=.*" ) then
-        id = string.gsub( vlc.path, "www.megavideo.com.*v=([^&]*).*$", "%1" )
-        path = "http://www.megavideo.com/xml/videolink.php?v=" .. id
-        return { { path = path } }
-    end
-
-    while true
-    do 
-        line = vlc.readline()
-        if not line then break end
-
-        -- we got the xml
-        if string.match( line, "<ROWS><ROW url=\"" )
-        then
-            xml = ""
-            while line do
-                -- buffer the full xml
-                xml = xml .. line .. '\n'
-                line = vlc.readline()
-            end
-            -- now gets the encoded url
-            s = string.gsub( xml, ".*ROW url=\"([^\"]*).*", "%1" )
-            path = ""
-            i = 1
-            while s:byte(i) do
-                c = s:byte(i)
-                if c % 4 < 2 then mod = 0 else mod = 4 end
-                if c < 16 and c > 3 then key = 61 + mod
-                elseif c < 96 and c > 67 then key = 189 + mod
-                elseif c < 20 and c > 6 then key = 65
-                else vlc.msg_err("Oops, please report URL to developers")
-                end
-                i = i + 1
-                path = path .. string.char(key - c)
-            end
-        end
-        if path then break end
-    end
-    if path then
-        return { { path = path } }
-    else
-        return { }
-    end
-end
diff --git a/share/luaplaylist/metacafe.lua b/share/luaplaylist/metacafe.lua
deleted file mode 100644 (file)
index b7ceb3e..0000000
+++ /dev/null
@@ -1,52 +0,0 @@
---[[
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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, "metacafe.com" ) 
-        and (  string.match( vlc.path, "watch/" )
-            or string.match( vlc.path, "mediaURL=" ) )
-end
-
--- Parse function.
-function parse()
-    if string.match( vlc.path, "watch/" )
-    then -- This is the HTML page's URL
-        while true do
-            -- Try to find the video's title
-            line = vlc.readline()
-            if not line then break end
-            if string.match( line, "<meta name=\"title\"" ) then
-                name = string.gsub( line, "^.*content=\"Metacafe %- ([^\"]*).*$", "%1" )  
-            end
-            if string.match( line, "<meta name=\"description\"" ) then
-                description = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )  
-            end
-            if string.match( line, "<link rel=\"image_src\"" ) then
-                arturl = string.gsub( line, "^.*href=\"([^\"]*)\".*$", "%1" )
-            end
-            if name and description and arturl then break end
-        end
-        return { { path = string.gsub( vlc.path, "^.*watch/(.*[^/])/?$", "http://www.metacafe.com/fplayer/%1.swf" ); name = name; description = description; arturl = arturl;  } }
-    else -- This is the flash player's URL
-        return { { path = string.gsub( vlc.path, "^.*mediaURL=([^&]*).*$", "%1" ) } }
-    end
-end
diff --git a/share/luaplaylist/youtube.lua b/share/luaplaylist/youtube.lua
deleted file mode 100644 (file)
index ea1a613..0000000
+++ /dev/null
@@ -1,111 +0,0 @@
---[[
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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.
---]]
-
--- Helper function to get a parameter's value in a URL
-function get_url_param( url, name )
-    return string.gsub( url, "^.*[&?]"..name.."=([^&]*).*$", "%1" )
-end
-
-function get_arturl( path, video_id )
-    if string.match( vlc.path, "iurl=" ) then
-        return vlc.decode_uri( get_url_param( vlc.path, "iurl" ) )
-    end
-    if not arturl then
-        return "http://img.youtube.com/vi/"..video_id.."/default.jpg"
-    end
-end
-
--- Probe function.
-function probe()
-    if vlc.access ~= "http" then
-        return false
-    end
-    youtube_site = string.match( string.sub( vlc.path, 1, 8 ), "youtube" )
-    if not youtube_site then
-        -- FIXME we should be using a builtin list of known youtube websites
-        -- like "fr.youtube.com", "uk.youtube.com" etc..
-        youtube_site = string.find( vlc.path, ".youtube.com" )
-        if youtube_site == nil then
-            return false
-        end
-    end
-    return (  string.match( vlc.path, "watch%?v=" ) -- the html page
-            or string.match( vlc.path, "watch_fullscreen%?video_id=" ) -- the fullscreen page
-            or string.match( vlc.path, "p.swf" ) -- the (old?) player url
-            or string.match( vlc.path, "jp.swf" ) -- the (new?) player url (as of 24/08/2007)
-            or string.match( vlc.path, "player2.swf" ) ) -- another player url
-end
-
--- Parse function.
-function parse()
-    if string.match( vlc.path, "watch%?v=" )
-    then -- This is the HTML page's URL
-        while true do
-            -- Try to find the video's title
-            line = vlc.readline()
-            if not line then break end
-            if string.match( line, "<meta name=\"title\"" ) then
-                name = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )
-            end
-            if string.match( line, "<meta name=\"description\"" ) then
-                description = string.gsub( line, "^.*content=\"([^\"]*).*$", "%1" )
-            end
-            if string.match( line, "subscribe_to_user=" ) then
-                artist = string.gsub( line, ".*subscribe_to_user=([^&]*).*", "%1" )
-            end
-            -- OLD: var swfArgs = {hl:'en',BASE_YT_URL:'http://youtube.com/',video_id:'XPJ7d8dq0t8',l:'292',t:'OEgsToPDskLFdOYrrlDm3FQPoQBYaCP1',sk:'0gnr-AE6QZJEZmCMd3lq_AC'};
-            -- NEW: var swfArgs = { "BASE_YT_URL": "http://youtube.com", "video_id": "OHVvVmUNBFc", "l": 88, "sk": "WswKuJzDBsdD6oG3IakCXgC", "t": "OEgsToPDskK3zO44y0QN8Fr5ZSAZwCQp", "plid": "AARGnwWMrmGkbpOxAAAA4AT4IAA", "tk": "mEL4E7PqHeaZp5OG19NQThHt9mXJU4PbRTOw6lz9osHi4Hixp7RE1w=="};
-            if string.match( line, "swfArgs" ) and string.match( line, "video_id" ) then
-                if string.match( line, "BASE_YT_URL" ) then
-                    base_yt_url = string.gsub( line, ".*\"BASE_YT_URL\": \"([^\"]*).*", "%1" )
-                end
-                t = string.gsub( line, ".*\"t\": \"([^\"]*).*", "%1" )
-                -- vlc.msg_err( t )
-                -- video_id = string.gsub( line, ".*&video_id:'([^']*)'.*", "%1" )
-            end
-            if name and description and artist --[[and video_id]] then break end
-        end
-        if not video_id then
-            video_id = get_url_param( vlc.path, "v" )
-        end
-        if not base_yt_url then
-            base_yt_url = "http://youtube.com/"
-        end
-        arturl = get_arturl( vlc.path, video_id )
-        if t then
-            return { { path = base_yt_url .. "get_video?video_id="..video_id.."&t="..t; name = name; description = description; artist = artist; arturl = arturl } }
-        else
-            -- This shouldn't happen ... but keep it as a backup.
-            return { { path = "http://www.youtube.com/v/"..video_id; name = name; description = description; artist = artist; arturl = arturl } }
-        end
-    else -- This is the flash player's URL
-        if string.match( vlc.path, "title=" ) then
-            name = get_url_param( vlc.path, "title" )
-        end
-        video_id = get_url_param( vlc.path, "video_id" )
-        arturl = get_arturl( vlc.path, video_id )
-        if not string.match( vlc.path, "t=" ) then
-            -- This sucks, we're missing "t" which is now mandatory. Let's
-            -- try using another url
-            return { { path = "http://www.youtube.com/v/"..video_id; name = name; arturl = arturl } }
-        end
-        return { { path = "http://www.youtube.com/get_video.php?video_id="..video_id.."&t="..get_url_param( vlc.path, "t" ); name = name; arturl = arturl } }
-    end
-end
diff --git a/share/luaplaylist/youtube_homepage.lua b/share/luaplaylist/youtube_homepage.lua
deleted file mode 100644 (file)
index 5c7e88a..0000000
+++ /dev/null
@@ -1,53 +0,0 @@
---[[
-  Parse YouTube homepage and browse pages. Next step is to recode firefox
-  in VLC ... using Lua of course ;)
-
- $Id$
-
- Copyright © 2007 the VideoLAN team
-
- 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.
---]]
-
-function probe()
-    return vlc.access == "http" and ( string.match( vlc.path, "youtube.com/%?$" ) or string.match( vlc.path, "youtube.com/browse" ) )
-end
-
-function parse()
-    p = {}
-    while true
-    do
-        line = vlc.readline()
-        if not line then break end
-        for _path, _artist, _name in string.gmatch( line, "href=\"(/watch%?v=[^\"]*)\" onclick=\"_hbLink%('([^']*)','Vid[^\']*'%);\">([^<]*)</a><br/>" )
-        do
-            path = "http://www.youtube.com" .. _path
-            name = vlc.resolve_xml_special_chars( _name )
-            artist = _artist
-        end
-        for _min, _sec in string.gmatch( line, "<span class=\"runtime\">(%d*):(%d*)</span>" )
-        do
-            duration = 60 * _min + _sec
-        end
-        if path and name and artist and duration then
-            table.insert( p, { path = path; name = name; artist = artist; duration = duration } )
-            path = nil
-            name = nil
-            artist = nil
-            duration = nil
-        end
-    end
-    return p
-end