Page 1 of 4
[Extension] Time
Posted: 31 Jan 2012 20:29
by mederi
I have found an interesting Lua script called "
When will this be over?"
I have altered the script a bit to display
24-hour format and
a bit longer on screen (5 seconds).
Code: Select all
local systemHour = os.date("%H")
local endingHour = math.floor((((systemSecond + remainingSecond) / 60 + (systemMinute + remainingMinute)) / 60 + systemHour + remainingHour) % 24)
local outputString = string.format("%02d:%02d:%02d", endingHour, endingMinute, endingSecond)
vlc.osd.message("Show will be done at " .. outputString,channel1,"top-left",5000000)
Duration and positioning of OSD text works in VLC 1.2.0 and over.
How to display OSD text longer in VLC 1.1.x? A workaround?
Is it already possible to add a Hotkey to trigger an extension (one on/off key)?
Thanks
--- EDIT (12.3.2012) ---
Topic's name changed: old name - "VLC Extension: When will this be over?", new name - "VLC extension: Time".
Re: VLC Extension: When will this be over?
Posted: 31 Jan 2012 20:37
by Jean-Baptiste Kempf
No, only in 2.0 it is able to do so.
Not possible to add a Hotkey, no.
Re: VLC Extension: When will this be over?
Posted: 01 Feb 2012 15:09
by mederi
You liar
I have just found out at least how to make duration for osd.message() in VLC 1.1.x
Code: Select all
for i=1,5,.5 do
vlc.osd.message("Hello!\n" .. 6-math.floor(i))
vlc.misc.mwait(vlc.misc.mdate() + 500000)
end
Re: VLC Extension: When will this be over?
Posted: 01 Feb 2012 16:14
by Jean-Baptiste Kempf
This is cheating
VLC Extension: TIME
Posted: 28 Feb 2012 16:45
by mederi
Here is my minimalist extension script to display actual time in a playing video. Unfortunately it does not work in new VLC2 due to disabled vlc.misc, so please use it only within VLC1.1.x.
Code: Select all
-- file: "time.lua" -- minimalist extension script to display actual time in a video
function descriptor()
return {title = "Time"}
end
function activate()
while vlc.input.is_playing() do -- time loop works until video is stopped (mostly)
local systemTime = os.date("%H:%M:%S") -- reads and formats OS time
vlc.osd.message(systemTime) -- displays time on a screen in a video
vlc.misc.mwait(vlc.misc.mdate() + 500000) -- waits half second before next time's update
end
fail() -- undefined function to cause error to KILL the running script
end
A proper full structure of extension scripts would not make it any better here. The running loop ignores everything until the video is stopped (mostly). I have not found a better way to control the running loop yet. I have unsuccessfully tried to control it using a dialog box with a STOP button. It has not worked.
Simply VLC Lua extensions have not been designed for this purpose. However, it could be the best time to improve and enhance scripting abilities within new VLC2 to add some dynamics.
Perhaps I could make some fully-featured time extension with a dialog box with various time options to choose from (actual time, actual playback position, duration, formatting, ...).
Re: VLC Extension: When will this be over?
Posted: 28 Feb 2012 19:16
by Jean-Baptiste Kempf
I will try to improve VLC extensions soon.
However, vlc.misc.mwait(vlc.misc.mdate() + 500000) is really a hack.
What about defining a time in vlc.osd.message?
Re: VLC Extension: When will this be over?
Posted: 29 Feb 2012 20:59
by mederi
Hello!
vlc.osd.message() with defined time is good for one-off static information. When I use it in a loop trying to display the running time then the whole CPU power is taken and VLC is blocked. I do not know how to replace the
vlc.misc.mwait() as a not-busy-wait. It is quite useful for me.
Code: Select all
-- file: "time2.lua" -- minimalist extension script to display actual time in a video
function descriptor()
return {title = "time2"}
end
function activate()
----------
if not vlc.misc then -- we are in new VLC2 without vlc.misc
vlc.msg.info("We are in new VLC2")
channel = vlc.osd.channel_register()
--while vlc.input.is_playing() do
local systemTime = os.date("%H:%M:%S")
vlc.osd.message(systemTime,channel,"top-left",5000000) -- 5 seconds
--end
--vlc.osd.channel_clear(channel)
else -- we are in older VLC supporting vlc.misc
vlc.msg.info("We are in old VLC1")
----------
while vlc.input.is_playing() do -- time loop works until video is stopped (mostly)
local systemTime = os.date("%H:%M:%S") -- reads and formats OS time
vlc.osd.message(systemTime) -- displays time on a screen in a video
vlc.misc.mwait(vlc.misc.mdate() + 500000) -- waits half second before next time's update
end
fail() -- undefined function to cause error to KILL the running script
end
end
So far I have not found out how to use
vlc.var.add_callback() that would probably stop my headaches
http://trac.videolan.org/vlc/ticket/6169
One way to wait on an event would be to use vlc.var.add_callback on the playback time variable.
There is an example of use of vlc.var.add_callback() in hotkeys.lua. You'd probably want to use something like vlc.var.add_callback(vlc.object.input(), "time", your_function, your_data)
If you need to wait for events, then implement correct event handling.
Code: Select all
function activate()
vlc.var.add_callback(vlc.object.input(), "time", your_function, your_data)
end
function your_function(variable_name, old_value, new_value, data)
???
end
How to use it to wait for a while? How to use it to check whether it is already the right time for action (to display/clear OSD text)? Studying of "hotkeys.lua" interface script does not help me very much.
Re: VLC Extension: When will this be over?
Posted: 01 Mar 2012 11:29
by Jean-Baptiste Kempf
Then callback on position change.
Re: VLC Extension: When will this be over?
Posted: 01 Mar 2012 23:59
by mineirtoikd
This is for position change. Please correct me if I am wrong because I am very beginner.
Code: Select all
function descriptor()
return { ...
...
capabilities = { "input-listener", "meta-listener", "playing-listener" }
}
end
function position_change(var, old, new, data)
vlc.osd.message("Var:" .. tostring(var .. '\n') .. "Old:" .. tostring(old .. '\n') .. "New:" .. tostring(new .. '\n') .. "Data:" .. tostring(data))
end
function activate()
vlc.var.add_callback(vlc.object.input(), "position", position_change)
end
function deactivate()
vlc.var.del_callback(vlc.object.input(), "position", position_change)
end
I am not sure if i am using the callback functions correctly.
Sorry for bad English.
Re: VLC Extension: When will this be over?
Posted: 02 Mar 2012 02:44
by Jean-Baptiste Kempf
It should be fine, indeed.
Re: VLC Extension: When will this be over?
Posted: 02 Mar 2012 17:26
by mederi
Seems that the playback
time is not an event triggering a callback function. It does not work:
Code: Select all
-- test-callback-input.time.lua --
function descriptor()
return {title = "test-callback-input.time";}
end
function time_change(var , old, new, data)
--tt=os.clock()
--if tt>(t+0.5) then
--t=tt
vlc.osd.message(tostring(var)..'\n'..tostring(old)..'\n'..tostring(new)..'\n'..tostring(data),channel1,"top-left",5000000)
--end
end
function activate()
--t=os.clock()
vlc.var.add_callback(vlc.object.input(), "time", time_change)
end
function deactivate()
vlc.var.del_callback(vlc.object.input(), "time", time_change)
end
function close()
deactivate()
end
The
position reacts only if a playback position is changed by a mouse on a time slider on a control panel.
Code: Select all
-- test-callback-input.position.lua --
function descriptor()
return {title = "test-callback-input.position";}
end
function position_change(var, old, new, data)
vlc.osd.message(tostring(var)..'\n'..tostring(old)..'\n'..tostring(new)..'\n'..tostring(data),channel1,"top-left",5000000)
end
function activate()
vlc.var.add_callback(vlc.object.input(), "position", position_change)
end
function deactivate()
vlc.var.del_callback(vlc.object.input(), "position", position_change)
end
function close()
deactivate()
end
I really would need something like:
misc.timer(callback)
A callback function should work in a loop with a certain time pause among iterations. The rest of a script should work normally along with a looping callback function with an ability to stop the looping callback function for example by an event or by a button in a dialog box; some kind of timer killer.
Re: VLC Extension: When will this be over?
Posted: 02 Mar 2012 19:02
by Jean-Baptiste Kempf
timers and polling encourage incorrect programming.
Re: VLC Extension: When will this be over?
Posted: 03 Mar 2012 17:11
by mederi
Jean-Baptiste, you probably want to train me to detective
O.K. I went again through older forum topics and found it (
here):
>>> Input variables <<<
Code: Select all
-- time.lua -- VLC extension --
function descriptor()
return {title = "time";
capabilities = {"input-listener"}
}
end
function activate()
local input = vlc.object.input()
if input then
vlc.var.add_callback(input, "intf-event", input_event_handler, "Hello world!")
else
vlc.deactivate()
end
end
function deactivate()
--if vlc.input.is_playing() then
local input = vlc.object.input()
if input then
vlc.var.del_callback(input, "intf-event", input_event_handler, "Hello world!")
end
end
function input_changed()
vlc.deactivate()
end
function input_event_handler(var, old, new, data)
--vlc.osd.message(tostring(var)..'\n'..tostring(old)..'\n'..tostring(new)..'\n'..tostring(data))
local systemTime = os.date("%H:%M:%S") -- reads and formats OS time
vlc.osd.message(systemTime) -- displays time on a screen in a video
--vlc.msg.info(systemTime)
end
Now I can also prepare some dialog box with some more options to choose from.
Great things can start to happen
--- EDIT --- 6.3.2012 --- script update, bug: "input-listener" looks for meta_changed()
Re: VLC Extension: When will this be over?
Posted: 03 Mar 2012 19:11
by Jean-Baptiste Kempf
Cool. We need to document this.
TYPEWRITER
Posted: 06 Mar 2012 14:38
by mederi
TYPEWRITER
- a VLC2 extension script to test vlc.osd.message() capabilities => 2 bugs in positioning: "center" and "right"
Code: Select all
-- typewriter.lua -- VLC2 extension --
function descriptor()
return {title = "typewriter";}
end
function activate()
local input = vlc.object.input()
if input then
vlc.var.add_callback(input, "intf-event", input_event_handler, "Hello world!")
create_dialog()
else
vlc.deactivate()
end
end
function deactivate()
local input = vlc.object.input()
if input then
vlc.var.del_callback(input, "intf-event", input_event_handler, "Hello world!")
end
end
function close()
vlc.deactivate()
end
function input_event_handler(var, old, new, data)
vlc.osd.message(w1:get_text(),channel1,"top-left")
vlc.osd.message(w2:get_text(),channel2,"top")
vlc.osd.message(w3:get_text(),channel3,"top-right")
vlc.osd.message(w4:get_text(),channel4,"left")
vlc.osd.message(w5:get_text(),channel5,"center") -- bug: top-left instead
vlc.osd.message(w6:get_text(),channel6,"right") -- bug: center instead
vlc.osd.message(w7:get_text(),channel7,"bottom-left")
vlc.osd.message(w8:get_text(),channel8,"bottom")
vlc.osd.message(w9:get_text(),channel9,"bottom-right")
end
function create_dialog()
w = vlc.dialog("typewriter")
w1 = w:add_text_input("",1,1,1,1)
w2 = w:add_text_input("",2,1,1,1)
w3 = w:add_text_input("",3,1,1,1)
w4 = w:add_text_input("",1,2,1,1)
w5 = w:add_text_input("",2,2,1,1)
w6 = w:add_text_input("",3,2,1,1)
w7 = w:add_text_input("",1,3,1,1)
w8 = w:add_text_input("",2,3,1,1)
w9 = w:add_text_input("",3,3,1,1)
w10 = w:add_button("CLEAR", click_CLEAR,1,4,1,1)
channel1 = vlc.osd.channel_register()
channel2 = vlc.osd.channel_register()
channel3 = vlc.osd.channel_register()
channel4 = vlc.osd.channel_register()
channel5 = vlc.osd.channel_register()
channel6 = vlc.osd.channel_register()
channel7 = vlc.osd.channel_register()
channel8 = vlc.osd.channel_register()
channel9 = vlc.osd.channel_register()
end
function click_CLEAR()
w1:set_text("")
w2:set_text("")
w3:set_text("")
w4:set_text("")
w5:set_text("")
w6:set_text("")
w7:set_text("")
w8:set_text("")
w9:set_text("")
end
--- EDIT ---
Ticket #6326: capabilities = {"input-listener"}; vlc.osd.message()
Re: VLC Extension: When will this be over?
Posted: 07 Mar 2012 13:47
by mederi
to Jean-Baptiste:
I still think that we should have some kind of timer available to execute some callback functions at desired frequency and the ability to stop it. Something like: id=vlc.timer(callback, 0.1); and then after some event or after certain number of calls: vlc.timer.stop(id).
Input event responds luckily 4-5 times a second. So far I have used this only as a clock to read time value for the running time displayed in video. I will use input events in external subtitler I plan to do. What if I would like to show the running time in a dialog box that should work also without any loaded and playing film or song? Stop-watch updated every 100 ms (10 times per second), why not? The timer is useful and have a certain purpose.
The more functions script writers will have to choose from, the more new ideas and scripts will be written.
Thanks
Re: VLC extension: Time
Posted: 12 Mar 2012 15:10
by mederi
Hello!
I am happy I can finally share my complete script also with dialog box. Before uploading it to official website for VLC addons I would like you to test it first. I have also a couple of issues to discuss.
VLC extension: Time
Code: Select all
-- time.lua -- VLC extension script--
-- defaults
time_format = "[T]" -- [T]-ime, [O]-ver, [E]-lapsed, [D]-uration, [R]-remaining
osd_position = "top-right"
-- predefined time format patterns
time_formats = {"[T]", "[T] >> [O]", "[E] / [D]", "-[R] / [D]", "-[R] ([T])"}
function descriptor()
return {
title = "Time";
version = "1.0";
author = "";
url = 'http://forum.videolan.org/viewtopic.php?f=29&t=97639#p332364';
shortdesc = "Time displayer";
description = "<div style=\"background-color:lightgreen;\"><b>Time</b> is VLC extension (extension script \"time.lua\") to display running time on the screen in a playing video.</div>";
capabilities = {"input-listener"}
}
end
function activate()
input_callback("add")
create_dialog()
end
function deactivate()
input_callback("delete")
end
function close()
vlc.deactivate()
end
function input_changed()
input_callback("add")
end
function input_callback(action)
local input = vlc.object.input()
if input and action=="add" then
vlc.var.add_callback(input, "intf-event", input_event_handler, "Hello world!")
elseif input and action=="delete" then
vlc.var.del_callback(input, "intf-event", input_event_handler, "Hello world!")
end
end
t=0
function input_event_handler(var, old, new, data)
tt=os.clock()
if tt>=(t+.5) then -- OSD update approximately 2 times per second instead of 4-5 times
t=tt
--vlc.osd.message(tostring(var)..'\n'..tostring(old)..'\n'..tostring(new)..'\n'..tostring(data))
--local systemTime = os.date("%H:%M:%S") -- reads and formats OS time
if time_format~=nil or time_format~="" then
osd_output = decode_time_format()
vlc.osd.message(osd_output, channel1, osd_position) -- displays time on the screen in a video
end
--vlc.msg.info(systemTime)
end
end
function decode_time_format()
local input = vlc.object.input()
local elapsed_time = vlc.var.get(input, "time")
--local duration = vlc.var.get(input, "length")
local duration = vlc.input.item():duration()
local systemHour = os.date("%H")
local systemMinute = os.date("%M")
local systemSecond = os.date("%S")
local elapsedHour = math.floor(elapsed_time / 3600)
local elapsedMinute = math.floor((elapsed_time % 3600) / 60)
local elapsedSecond = math.floor(elapsed_time % 60)
if duration>0 then
local durationHour = math.floor(duration / 3600)
local durationMinute = math.floor((duration % 3600) / 60)
local durationSecond = math.floor(duration % 60)
remaining_time = duration - elapsed_time
local remainingHour = math.floor(remaining_time / 3600)
local remainingMinute = math.floor((remaining_time % 3600) / 60)
local remainingSecond = math.floor(remaining_time % 60)
local endingSecond = math.floor((systemSecond + remainingSecond) % 60)
local endingMinute = math.floor(((systemSecond + remainingSecond) / 60 + (systemMinute + remainingMinute)) % 60)
local endingHour = math.floor((((systemSecond + remainingSecond) / 60 + (systemMinute + remainingMinute)) / 60 + systemHour + remainingHour) % 24)
duration = string.format("%02d:%02d:%02d", durationHour, durationMinute, durationSecond)
remaining_time = string.format("%02d:%02d:%02d", remainingHour, remainingMinute, remainingSecond)
ending_time = string.format("%02d:%02d:%02d", endingHour, endingMinute, endingSecond)
else
duration = "--:--"
remaining_time = "--:--"
ending_time = "--:--"
end
local elapsed_time = string.format("%02d:%02d:%02d", elapsedHour, elapsedMinute, elapsedSecond)
--local system_time = os.date("%H:%M:%S")
local system_time = systemHour..":"..systemMinute..":"..systemSecond
local osd_output = string.gsub(time_format, "%[E%]", elapsed_time)
local osd_output = string.gsub(osd_output, "%[T%]", system_time)
local osd_output = string.gsub(osd_output, "%[D%]", duration)
local osd_output = string.gsub(osd_output, "%[R%]", remaining_time)
local osd_output = string.gsub(osd_output, "%[O%]", ending_time)
return osd_output
end
function create_dialog()
w = vlc.dialog("TIME")
--w1 = w:add_label("Time format: \\ Position:",1,1,2,1)
w1 = w:add_label("<b>Time format:</b>",1,1,1,1)
w01 = w:add_label("<b>\\ Position:</b>",2,1,1,1)
w2 = w:add_dropdown(3,1,1,1)
w2:add_value("top-left", 1)
w2:add_value("top", 2)
w2:add_value("top-right", 3)
w2:add_value("left", 4)
w2:add_value("center", 5)
w2:add_value("right", 6)
w2:add_value("bottom-left", 7)
w2:add_value("bottom", 8)
w2:add_value("bottom-right", 9)
w2:set_text(osd_position)
w3 = w:add_text_input(time_format,1,2,3,1)
w4 = w:add_dropdown(1,3,2,1)
w4:add_value("", 1)
for i=1,#time_formats do
w4:add_value(time_formats[i], i+1)
end
w4:set_text("")
w10 = w:add_button("START", click_START,1,4,1,1)
w11 = w:add_button("STOP", click_STOP,2,4,1,1)
w12 = w:add_button(">> PUT^IN", click_PUTIN,3,3,1,1)
w13 = w:add_button("HELP", click_HELP,3,4,1,1)
end
function click_STOP()
time_format = ""
end
function click_START()
time_format = w3:get_text()
osd_position = w2:get_text()
end
function click_PUTIN()
w3:set_text(w4:get_text())
w4:set_text("")
w:update()
end
function click_HELP()
local help_text=""
.."<div style=\"background-color:lightgreen;\"><b>Time</b> is VLC extension (extension script \"time.lua\") to display running time on the screen in a playing video.</div>"
.."<hr />"
.."<center><b><a style=\"background-color:#FF7FAA;\"> Instructions </a></b></center>"
.."<b><a style=\"background-color:#FF7FAA;\">1.)</a></b> Choose a desired <b><a style=\"background-color:lightblue;\">position</a></b> from the drop-down menu.<br />"
.."<b><a style=\"background-color:#FF7FAA;\">2.)</a></b> In <b><a style=\"background-color:lightblue;\">time format</a></b> input field write some time pattern containing time tags. The list of available tags is below.<br />"
.."You can use predefined pattern from the drop-down menu. Choose one and put it in the time format field by pressing <b><nobr><a style=\"background-color:silver;\">[ >> PUT^IN ]</a></nobr></b> button.<br />"
.."<b><a style=\"background-color:#FF7FAA;\">3.)</a></b> Press <b><nobr><a style=\"background-color:silver;\">[ START ]</a></nobr></b> button for changes to take effect.<br /><br />"
.."<b>Following <a style=\"background-color:#FF7FAA;\">time tags</a> can be used within time format pattern:</b>"
.."<div style=\"background-color:#FF7FAA;\">"
.."<b> [T]</b> - actual system time;<br />"
.."<b> [O]</b> - time when video will be over;<br />"
.."<b> [E]</b> - elapsed time (current playback position);<br />"
.."<b> [R]</b> - remaining time;<br />"
.."<b> [D]</b> - duration (length);</div>"
.." > They are automatically replaced with actual time values on the screen.<br />"
.." > If duration value is not available then [D], [R], [O] is replaced with \"--:--\".<br />"
.." > You can also use some short descriptions or put some delimiters among time tags.<br />"
.."<div style=\"background-color:#FFFF7F;\"><b>OSD text format</b> can be customised within internal VLC settings:<br />"
.."Tools > Preferences > (Show settings - Simple) > Subtitles / OSD<br />"
.."Tools > Preferences > (Show settings - All) > +Video > +Subtitles / OSD > -Text renderer<br />"
.."Do not forget to Save and restart VLC for changes to take effect!</div>"
.."<hr />"
.."<div style=\"background-color:lightblue;\">"
.."<b>Homepage:</b> <a href=\"http://forum.videolan.org/viewtopic.php?f=29&t=97639#p332364\">VLC extension: Time</a><br />"
.."<b>Forum:</b> <a href=\"http://forum.videolan.org/viewforum.php?f=29\">Scripting VLC in Lua</a><br />"
.."Please, visit us and bring some new ideas.<br />"
.."Learn how to write own scripts and share them with us.<br />"
.."Help to build happy VLC community :o)</div>"
.."<pre> www<br />"
.." (. .)<br />"
.."-ooo-(_)-ooo-</pre>"
w5=w:add_html(help_text,1,5,3,1)
w14 = w:add_button("HELP (x)", click_HELPx,3,4,1,1)
w:update()
end
function click_HELPx()
w:del_widget(w5)
w:del_widget(w14)
w5=nil
w14=nil
w:update()
end
When stopping playback and then playing again, Messages window reports an error:
lua warning: Error while running script ...\lua\extensions\time.lua, function meta_changed() not found
In Time's dialog box - the drop-down menu with [ >> PUT^IN ] - pressing the button should also set the first empty item in drop-down menu. This setting works while initiating dialog box - please see the third option "top-right" in position drop down menu. VLC1 works like a charm with that but does not support positioning.
I would like to use some proper timer instead of using hacks or workarounds. Yes, the timer and polling that encourage incorrect programming
But in this case it would be correct programming.
Perhaps this script could be good enough to be included in official VLC release to attract and encourage new script writers. The script should be revised and corrected by VLC developers if necessary.
Re: VLC extension: Time
Posted: 19 Mar 2012 16:47
by mederi
A week later:
Everybody is happy, nobody cares
As I have found out, there is already a "Marquee" filter in VLC that is able to display running actual time:
Re: Please help me to add date/time marquee
I would like to ask also here.
Is it possible to use Marquee filter in extension script? I mean to control Marquee filter - on/off, text string, position, font size, color - from some dialog box of extension script.
At least I have learnt how to make own "Marquee"
All right, then, it goes to addons website anyway.
And let me introduce to you my next VLC extension script:
Sampler.
--- EDIT (23.3.2012) ---
Time: http://addons.videolan.org/content/show ... ent=149618
Time (lite): http://addons.videolan.org/content/show ... ent=149619
Re: VLC extension: Time
Posted: 20 Mar 2012 10:58
by Jean-Baptiste Kempf
video filters are not exposed, I think
Re: VLC extension: Time
Posted: 01 Apr 2012 13:15
by mederi
Re: VLC extension: Time
Posted: 23 May 2012 20:30
by Ashada
Sup Thx for your script.
I didn't know how to make an extension to VLC but thx to you I did what I wanted to do.
I'll buy you some cookies in RL if we ever meet.
Your scirpt was lacking one function and it was
total playlist duration.
I was pissed since the devs don't care about such function as seen here:
viewtopic.php?f=7&t=96760
so I made it and integrated with your script.
I'm going to release my changes under
WTFPL since you didn't specify a license for your code.
Teh code
Code: Select all
-- time.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/
* Mac OS X (all users): /Applications/VLC.app/Contents/MacOS/share/lua/extensions/
(create directories if they don't exist)
Restart the VLC.
Then you simply use the extension by going to the "View" menu and selecting it.
--]]
-- defaults
time_format = "[PLD]" -- [T]-ime, [O]-ver, [E]-lapsed, [D]-uration, [R]-remaining
osd_position = "top-right"
-- predefined time format patterns
time_formats = {"[T]", "[T] >> [O]", "[E] / [D]", "-[R] / [D]", "-[R] ([T])", "[PLD]"}
function descriptor()
return {
title = "Time";
version = "1.0";
author = "lubozle";
url = 'http://addons.videolan.org/content/show.php?content=149618';
shortdesc = "Time displayer";
description = "<div style=\"background-color:lightgreen;\"><b>Time</b> is VLC extension (extension script \"time.lua\") that displays running time on the screen in a playing video.</div>";
capabilities = {"input-listener"}
}
end
function activate()
input_callback("add")
create_dialog()
end
function deactivate()
input_callback("del")
end
function close()
vlc.deactivate()
end
function input_changed()
input_callback("toggle")
end
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 world!")
elseif input and callback==true and action=="del" then
callback=false
vlc.var.del_callback(input, "intf-event", input_events_handler, "Hello world!")
end
end
t=0
function input_events_handler(var, old, new, data)
tt=os.clock()
if tt>=(t+.5) then -- OSD update approximately 2 times per second instead of 4-5 times
t=tt
--vlc.osd.message(tostring(var)..'\n'..tostring(old)..'\n'..tostring(new)..'\n'..tostring(data))
--local systemTime = os.date("%H:%M:%S") -- reads and formats OS time
if time_format~=nil or time_format~="" then
osd_output = decode_time_format()
vlc.osd.message(osd_output, channel1, osd_position) -- displays time on the screen in a video
end
--vlc.msg.info(systemTime)
end
end
function dur_to_time(duration)
if duration>0 then
local durationHour = math.floor(duration / 3600)
local durationMinute = math.floor((duration % 3600) / 60)
local durationSecond = math.floor(duration % 60)
return durationHour, durationMinute, durationSecond
else
return -1
end
end
function playlist_duration()
local sum = 0
local play_list = vlc.playlist.get("playlist",false)
for k, video in pairs(play_list.children) do
if video.duration ~= -1 then
sum = sum + video.duration
end
end
local h, m, s = dur_to_time(sum)
return tostring(string.format("%02d:%02d:%02d", h, m, s))
end
function decode_time_format()
local input = vlc.object.input()
local elapsed_time = vlc.var.get(input, "time")
--local duration = vlc.var.get(input, "length")
local duration = vlc.input.item():duration()
local systemHour = os.date("%H")
local systemMinute = os.date("%M")
local systemSecond = os.date("%S")
local elapsedHour = math.floor(elapsed_time / 3600)
local elapsedMinute = math.floor((elapsed_time % 3600) / 60)
local elapsedSecond = math.floor(elapsed_time % 60)
if duration>0 then
local durationHour = math.floor(duration / 3600)
local durationMinute = math.floor((duration % 3600) / 60)
local durationSecond = math.floor(duration % 60)
remaining_time = duration - elapsed_time
local remainingHour = math.floor(remaining_time / 3600)
local remainingMinute = math.floor((remaining_time % 3600) / 60)
local remainingSecond = math.floor(remaining_time % 60)
local endingSecond = math.floor((systemSecond + remainingSecond) % 60)
local endingMinute = math.floor(((systemSecond + remainingSecond) / 60 + (systemMinute + remainingMinute)) % 60)
local endingHour = math.floor((((systemSecond + remainingSecond) / 60 + (systemMinute + remainingMinute)) / 60 + systemHour + remainingHour) % 24)
duration = string.format("%02d:%02d:%02d", durationHour, durationMinute, durationSecond)
remaining_time = string.format("%02d:%02d:%02d", remainingHour, remainingMinute, remainingSecond)
ending_time = string.format("%02d:%02d:%02d", endingHour, endingMinute, endingSecond)
else
duration = "--:--"
remaining_time = "--:--"
ending_time = "--:--"
end
local elapsed_time = string.format("%02d:%02d:%02d", elapsedHour, elapsedMinute, elapsedSecond)
--local system_time = os.date("%H:%M:%S")
local system_time = systemHour..":"..systemMinute..":"..systemSecond
local osd_output = string.gsub(time_format, "%[E%]", elapsed_time)
local osd_output = string.gsub(osd_output, "%[T%]", system_time)
local osd_output = string.gsub(osd_output, "%[D%]", duration)
local osd_output = string.gsub(osd_output, "%[R%]", remaining_time)
local osd_output = string.gsub(osd_output, "%[O%]", ending_time)
local osd_output = string.gsub(osd_output, "%[PLD%]", playlist_duration())
return osd_output
end
function create_dialog()
w = vlc.dialog("Time")
--w1 = w:add_label("Time format: \\ Position:",1,1,2,1)
w1 = w:add_label("<b>Time format:</b>",1,1,1,1)
w01 = w:add_label("<b>\\ Position:</b>",2,1,1,1)
w2 = w:add_dropdown(3,1,1,1)
w2:add_value("top-left", 1)
w2:add_value("top", 2)
w2:add_value("top-right", 3)
w2:add_value("left", 4)
w2:add_value("center", 5)
w2:add_value("right", 6)
w2:add_value("bottom-left", 7)
w2:add_value("bottom", 8)
w2:add_value("bottom-right", 9)
w2:set_text(osd_position)
w3 = w:add_text_input(time_format,1,2,3,1)
w4 = w:add_dropdown(1,3,2,1)
w4:add_value("", 1)
for i=1,#time_formats do
w4:add_value(time_formats[i], i+1)
end
w4:set_text("")
w10 = w:add_button("START", click_START,1,4,1,1)
w11 = w:add_button("STOP", click_STOP,2,4,1,1)
w12 = w:add_button(">> PUT^IN", click_PUTIN,3,3,1,1)
w13 = w:add_button("HELP", click_HELP,3,4,1,1)
end
function click_STOP()
time_format = ""
end
function click_START()
time_format = w3:get_text()
osd_position = w2:get_text()
end
function click_PUTIN()
w3:set_text(w4:get_text())
w4:set_text("")
w:update()
end
function click_HELP()
local help_text=""
.."<div style=\"background-color:lightgreen;\"><b>Time</b> is VLC extension (extension script \"time.lua\") that displays running time on the screen in a playing video.</div>"
.."<hr />"
.."<center><b><a style=\"background-color:#FF7FAA;\"> Instructions </a></b></center>"
.."<b><a style=\"background-color:#FF7FAA;\">1.)</a></b> Choose a desired <b><a style=\"background-color:lightblue;\">position</a></b> from the drop-down menu.<br />"
.."<b><a style=\"background-color:#FF7FAA;\">2.)</a></b> In <b><a style=\"background-color:lightblue;\">time format</a></b> input field write some time pattern containing time tags. The list of available tags is below.<br />"
.."You can use predefined pattern from the drop-down menu. Choose one and put it in the time format field by pressing <b><nobr><a style=\"background-color:silver;\">[ >> PUT^IN ]</a></nobr></b> button.<br />"
.."<b><a style=\"background-color:#FF7FAA;\">3.)</a></b> Press <b><nobr><a style=\"background-color:silver;\">[ START ]</a></nobr></b> button for changes to take effect.<br /><br />"
.."<b>Following <a style=\"background-color:#FF7FAA;\">time tags</a> can be used within time format pattern:</b>"
.."<div style=\"background-color:#FF7FAA;\">"
.."<b> [T]</b> - actual system time;<br />"
.."<b> [O]</b> - time when video will be over;<br />"
.."<b> [E]</b> - elapsed time (current playback position);<br />"
.."<b> [R]</b> - remaining time;<br />"
.."<b> [D]</b> - duration (length);<br />"
.."<b> [PLD]</b> - playlist duration (length);</div>"
.." > They are automatically replaced with actual time values on the screen.<br />"
.." > If duration value is not available then [D], [R], [O] is replaced with \"--:--\".<br />"
.." > You can also use some short descriptions or put some delimiters among time tags.<br />"
.."<div style=\"background-color:#FFFF7F;\"><b>OSD text format</b> can be customised within internal VLC settings:<br />"
.."Tools > Preferences > (Show settings - Simple) > Subtitles / OSD<br />"
.."Tools > Preferences > (Show settings - All) > +Video > +Subtitles / OSD > -Text renderer<br />"
.."Do not forget to Save and restart VLC for changes to take effect!</div>"
.."<hr />"
.."<div style=\"background-color:lightblue;\">"
.."<b>Homepage:</b> <a href=\"http://forum.videolan.org/viewtopic.php?f=29&t=97639#p332364\">VLC extension: Time</a><br />"
.."<b>Forum:</b> <a href=\"http://forum.videolan.org/viewforum.php?f=29\">Scripting VLC in Lua</a><br />"
.."Please, visit us and bring some new ideas.<br />"
.."Learn how to write own scripts and share them with us.<br />"
.."Help to build happy VLC community :o)</div>"
.."<pre> www<br />"
.." (. .)<br />"
.."-ooo-(_)-ooo-</pre>"
w5=w:add_html(help_text,1,5,3,1)
w14 = w:add_button("HELP (x)", click_HELPx,3,4,1,1)
w:update()
end
function click_HELPx()
w:del_widget(w5)
w:del_widget(w14)
w5=nil
w14=nil
w:update()
end
The code might be better but I didn't want to entirely replace it so I just made a patch.
The code for playlist duration is [PLD]
Use it how ever you wish.
Re: VLC extension: Time
Posted: 23 May 2012 23:45
by Jean-Baptiste Kempf
addons.videolan.org
Re: VLC extension: Time
Posted: 27 May 2012 12:53
by mederi
Ashada, thank you for adding new [PLD] tag for total playlist duration and demonstrating nice coding:
Code: Select all
---
function dur_to_time(duration)
if duration>0 then
local durationHour = math.floor(duration / 3600)
local durationMinute = math.floor((duration % 3600) / 60)
local durationSecond = math.floor(duration % 60)
return durationHour, durationMinute, durationSecond
else
return -1
end
end
function playlist_duration()
local sum = 0
local play_list = vlc.playlist.get("playlist",false)
for k, video in pairs(play_list.children) do
if video.duration ~= -1 then
sum = sum + video.duration
end
end
local h, m, s = dur_to_time(sum)
return tostring(string.format("%02d:%02d:%02d", h, m, s))
end
---
local osd_output = string.gsub(osd_output, "%[PLD%]", playlist_duration())
I will update the extension on addons.videolan.org soon. Probably I will also add some label widget in dialog box to display time information there. It will be good for music files without any video track and without visualisation turned on.
Re: VLC extension: Time
Posted: 29 Jul 2012 19:55
by jose.mira
Hi.
Based on Ashada's code I develped an extension that shows a dialog with the playlist's total time.
BTW, I also changed the
dur_time return value when the
duration is not greater than zero, so that it return in the same format as when the duration is greater than zero.
As Ashada, I'm also releasing this as
WTFPL!
If you find any problem with the script, please shout it out.
Code: Select all
-- playlistduration.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/
* Mac OS X (all users): /Applications/VLC.app/Contents/MacOS/share/lua/extensions/
(create directories if they don't exist)
Restart the VLC.
Then you simply use the extension by going to the "View" menu and selecting it.
--]]
function descriptor()
return { title = "Playlist Duration" ;
version = "1.0" ;
author = "abremir" ;
url = '';
shortdesc = "Playlist Duration";
description = "Get the playlist duration.\n"
.. "Returns the total play time of the current playlist." ;
}
end
function activate()
vlc.msg.info("[playlist duration] start")
playdur = vlc.dialog("Playlist Duration")
playdur:add_label("", 1, 1, 11, 2)
playdur:add_label("Total time:", 12, 1, 1, 2)
durlabel=playdur:add_label(playlist_duration(), 13, 1, 1, 2)
playdur:add_label("", 14, 1, 11, 2)
playdur:add_button("Ok", close_dialog, 12, 3, 2, 1)
playdur:show()
end
function deactivate()
vlc.msg.info("[playlist duration] stop")
end
function close_dialog()
vlc.deactivate()
end
function dur_to_time(duration)
if duration>0 then
local durationHour = math.floor(duration / 3600)
local durationMinute = math.floor((duration % 3600) / 60)
local durationSecond = math.floor(duration % 60)
return durationHour, durationMinute, durationSecond
else
return 0, 0, 0
end
end
function playlist_duration()
local sum = 0
local play_list = vlc.playlist.get("playlist",false)
for k, item in pairs(play_list.children) do
if item.duration ~= -1 then
sum = sum + item.duration
end
end
local h, m, s = dur_to_time(sum)
return tostring(string.format("%02d:%02d:%02d", h, m, s))
end
--- EDIT (12.3.2013, mederi) ---
Standalone forum topic for this extension: VLC Playlist Total Time Extension
Re: VLC extension: Time
Posted: 17 Aug 2012 00:31
by Zane
Found this Googling. Good job, guys!