-- take note of YtLink, I keep passing it around in order to show it as the title bar -- of the download window, YOU WILL HAVE TO PAY ATTENTION TO IT -- IT GOES THROUGH FUCKING EVERYTHING -- Also it will be replaced by what the user saves the file as -- keep that in mind as well require ('iuplua') local cancelflag --set variable local downloadProgress --set variable local function downloadStart(YtLink) --create button and cancle flag cancelButton = iup.button{ title = "Cancel", action = function() cancelflag = true --return iup.CLOSE --not sure if needed end } local pTest = "1" downloadProgress = iup.progressbar{expand="HORIZONTAL"} dlgProgress = iup.dialog{ --create main window title = YtLink, dialogframe = "YES", border = "YES", iup.vbox { -- create vbox that contains said objects downloadProgress, cancelButton, pTest, } } dlgProgress.size = "QUARTERxEIGHT" --should be size of dialog box -- dlgProgress.menubox = "NO" -- no windows menus dlgProgress.close_cb = cancelButton.action -- calls the action of the button dlgProgress:showxy(iup.CENTER, iup.CENTER) -- show and position box return dlgProgress end local function DL_progress(YtLink) -- monitor download progress downloadStart(YtLink) -- start the progress bar downloadProgress.value = 0 local pipe = io.popen("youtube-dl " ..YtLink) repeat local c = pipe:read(20) -- read the first 20 characters of each line if c then -- if c is true then... local b = string.match(c, '.....%%') -- %% in a string is "%" -- string.match finds the percent sign and then finds every character -- for every dot you place. dots before grab before the character -- dots after grab after the character --[[ Perhaps do a different method round up and only update if number has changed -- didn't help at all, reverted to less code]] if b then --here we take the last character off of the string --in this case it is the "percent" sign local b = string.sub(b,0,-2) downloadProgress.value = b/100 -- x out of 100 -- in this case x is the progress -- data we grabbed iup.Flush() -- speeds everything up considerably -- when changing an attribute of an element, the change may not -- take place immediately -- in that case throw in a flush after the change iup.LoopStep() -- required to work, also allows user to click button iup.Flush() -- added this second flush... helps a shit ton if cancelflag then -- if cancelflag is true, then break -- which happens if you click the button iup.Message("Terminated", "You have canceled the download") iup.Flush() break end end end until not c-- creating a loop until c is not true pipe:close() -- closing the ipopen iup.Close() end popin = {} popin.ytdl = function(tubeLink) DL_progress(tubeLink) end --if you can have your script call this one and insert the link to YtLink... win --local YtLink = ('http://www.youtube.com/watch?v=jrmlums5bV8') --DL_progress( YtLink)