Page 1 of 1

VLC extension, watch folder player craching

Posted: 12 Apr 2013 13:09
by perquin
Hi,

I making a small extension that play/broadcast in loop all files with a given extension that are in a specific folder.

Code: Select all

-- afptvfbroad.lua -- VLC extension -- --[[ INSTALLATION: Put the file in the VLC subdir /lua/extensions, by default: * Windows (all users): %ProgramFiles%\VideoLAN\VLC\lua\extensions\ * Windows (current user): %APPDATA%\VLC\lua\extensions\ * Linux (all users): /usr/share/vlc/lua/extensions/ * Linux (current user): ~/.local/share/vlc/lua/extensions/ (create directories if they don't exist) Relaunch the VLC with something like: "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" --file-logging --logfile="c:\toto\pp-vlc-log.txt" --scale=0.25 --log-verbose=2 --sout=#duplicate{dst=display,dst="standard{mux=ts,dst=158.50.181.255:10012,access=udp}"} or just the player Then you simply use the extension by going to the "View" menu and selecting it. --]] -----------CORE----------------- function descriptor() return { title = "AFTV FILES UDP BROADCASTER"; version = "0.9"; author = "work.philippe.perquin@gmail.com"; url = ''; shortdesc = "AFTV FILES UDP BROADCASTER"; description = "<div style=\"background-color:lightgreen;\"><b>AFTV FILES UDP BROADCASTER</b> AFTV FILES UDP BROADCASTER is VLC extension (extension script \"afptvfbroad.lua\") that UDP broadcast files in a folder.</div>"; capabilities = {"input-listener", "playing-listener", "meta-listener"} } end counter_update=0 function activate() display = vlc.dialog( "Playlist Update for: "..video_extension.." In folder: "..video_path ) display1=display:add_label( string.format("0") ,1,1,1,1) systemTime = os.date("%H:%M:%S") display2=display:add_label( string.format("0"),2,1,1,1) display3=display:add_button( "OK", function () display:hide() end,4,2,1,1 ) display:show() vlc.playlist.clear() update_playlist_add() update_playlist_delete() input_callback("add") if not vlc.input.is_playing() then vlc.playlist.play() vlc.playlist.loop("on") end end function deactivate() input_callback("del") if vlc.input.is_playing() then vlc.playlist.loop("off") vlc.playlist.stop() end end function close() vlc.deactivate() end function input_changed() input_callback("toggle") end function meta_changed() end function playing_changed() end old_input="titi" callback=false function input_callback(action) -- action=add/del/toggle if (action=="toggle" and callback==false) then action="add" elseif (action=="toggle" and callback==true) then action="del" end local input = vlc.object.input() if input and callback==false and action=="add" then callback=true vlc.var.add_callback(input, "intf-event", input_events_handler, "Hello AFPTV!") elseif input and callback==true and action=="del" then callback=false vlc.var.del_callback(input, "intf-event", input_events_handler, "Hello AFPTV!") end end last_call = 0 function input_events_handler(var, old, new, data) --Ordinarily one would do this to only act every 2 seconds. local current_call=os.clock() local result_call=current_call - last_call if result_call < 10 then return end last_call = current_call update_playlist_delete() update_playlist_add() display1:set_text( string.format("Process complete. Removed: " .. totaldelete .. " Added: " ..totaladd.. " Staying: " ..total_in_playlist) ,1,1,1,1) systemTime = os.date("%H:%M:%S") display2:set_text( string.format("Last update : " ..systemTime.." Updated: "..counter_update),2,1,1,1) display3:set_text( "OK", function () display:hide() end,4,2,1,1 ) display:update() local current_input = vlc.input.item() local current_input_name = current_input:name() local path_saved_file=string.format(video_path.."lastplay.txt") local saved_file = io.open(path_saved_file, "w") saved_file:write(string.format(systemTime.." Last file read : "..current_input_name)) saved_file:flush() saved_file:close() end ----------------------------REGLAGES --video_path="/Users/pil/Desktop/test liste/" video_path="C:/test liste/mp4/" video_extension=".mp4" ip_for_broadcast="" totaldelete=0 totaladd=0 total_in_playlist=0 ----------------------------CASE DELETE-- --verify if file from playlist are delete and delete them in playlist function update_playlist_delete() local counter = 0 for i, v in pairs(vlc.playlist.get("playlist",false).children) do -- check if delete if (string.find(v.name,video_extension)== nil) then --case delete delete it from playlist vlc.playlist.delete(tonumber(v.id)) --count deleted counter = counter + 1 end end --for all video in playlist for i, v in pairs(vlc.playlist.get("playlist",false).children) do -- check if delete if check_delete(v.path)==true then --case delete delete it from playlist vlc.playlist.delete(tonumber(v.id)) --count deleted counter = counter + 1 end end --return number of deleted totaldelete = counter -----------TEMP counter_update = counter_update + 1 end function check_delete(filepath) -- remove the file:/// from filepath local pathval = string.gsub(filepath, "file:\/\/\/", "") -- if pathval is NULL return if pathval==nil then return false end -- remove escape char from pathval pathval = unescape(pathval) -- try to acces the file local file,err,code = io.open(pathval, "r") -- if error and code 2 then file is deletete if err and code==2 then return true end return false end function unescape(str) -- translate the %% in file path local newstr = string.gsub (str, "%%(%x%x)", function(h) return string.char(tonumber(h,16)) end) if newstr==nil then newstr=str end return newstr end ----------------------------CASE ADD-- --verify if new files are in folder and add files with good video_extension in playlist function update_playlist_add() local counter = 0 local counter_in_playlist = 0 local file_allready_exist = false local new_item = {} -- Load directory contents into a table local contents_in_directory = vlc.net.opendir(video_path) -- for each file in directory for _, file_in_dir in pairs(contents_in_directory) do -- compare with each entry in the playlist for _, in_playlist in pairs(vlc.playlist.get("playlist",false).children) do --if exits stop compare saying it exist if in_playlist.name==file_in_dir then file_allready_exist=true end end -- if not exist add it to playlist if not file_allready_exist then new_item.path = "file:///"..video_path..file_in_dir new_item.name = file_in_dir --verify if it s good extension if not (string.find(file_in_dir,video_extension)== nil) then --add it to playlist not playing vlc.playlist.enqueue({new_item}) -- count as added counter = counter + 1 end end file_allready_exist=false end -- count total of video staying in playlist for _, in_playlist in pairs(vlc.playlist.get("playlist",false).children) do counter_in_playlist = counter_in_playlist + 1 end totaladd = counter total_in_playlist = counter_in_playlist -----------TEMP counter_update = counter_update + 1 end
The extension is working in windows and ubuntu, not in osx that not seem to be compatible with callback.

This extension seem to work with 2.05 and 2.06 but VLC crach after a few moment (sometime 5 minutes, 2 hours, 30 minutes). And i need to use it 24/24.

Can it comme from Lua?

Regards,

Philippe

Watch folder - Update playlist

Posted: 13 Apr 2013 15:23
by mederi
Yes, I have experienced similar unstability also in my extensions. While my first VLC Extension, Time, works very well, others suffer from occasional or frequent crash of VLC. There are some functions causing troubles if they are used in a script. For example, in my Subtitler (lite) fixed path works very well, while the autodetection not so well and there is just vlc.input.item():uri() used in function media_path(extension). There is another script relating playlists on the forum, Playlist randomizer, that also does not work very well. The bug must be somewhere around playlist and metadata.

You could try to debug the script by making a static extension instead of using callbacks, as has been suggested here: viewtopic.php?f=7&t=106236#p360372
You could also strip the working core, then add new functions to it and test particular stages. Perhaps you could find a stable workaround.

Re: VLC extension, watch folder player craching

Posted: 15 Apr 2013 09:18
by perquin
Hi mederi,

I will try to test it by function, else i goes to powersell and ffmpeg.

Regards,

Re: VLC extension, watch folder player craching

Posted: 17 Apr 2013 01:43
by Jean-Baptiste Kempf
Please file bugs.