VLC extension, watch folder player craching
Posted: 12 Apr 2013 13:09
Hi,
I making a small extension that play/broadcast in loop all files with a given extension that are in a specific folder.
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
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
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