Page 1 of 2

Delete current file from harddisk

Posted: 01 Mar 2013 15:14
by 147852369
--- EDIT ---
# Board index ‹ VLC media player ‹ VLC media player Feature Requests \ Delete current file from harddisk
-------------

I tried to debug this code, but anything I did I get an error message. "Permisson denied"...

Code: Select all

--[[ INSTALLATION (create directories if they don't exist): - 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/ - Restart VLC. ]]-- --[[ Extension description ]] function descriptor() return { title = "Diskdelete" ; version = "0.2" ; author = "Mark Morschhäuser" ; shortdesc = "DELETE current playing FILE FROM DISK"; description = "<h1>Diskdelete</h1>" .. "When you're playing a file, use Diskdelete to " .. "easily delete this file <b>from your disk</b> with one click." .. "<br>This will NOT change your playlist, it will <b>ERASE the file</b> itself!" .. "<br>It will not use the Recycle Bin, the file will be gone immediately!" .. "<br>This extension has been tested on GNU Linux with VLC 2.0.3." .. "<br>The author is not responsible for damage caused by this extension."; url = "https://github.com/VanNostrand/Diskdelete" } end --[[ Hooks ]] -- Activation hook function activate() vlc.msg.dbg("[Diskdelete] Activated") d = vlc.dialog("Diskdelete") d:add_label("<b>Clicking</b> this button will <b>delete</b> the currently playing file <b>from disk</b>.<br>You have to <b>be sure</b> as <b>you won't be asked</b> again!<br>You are responsible for your own actions, consider yourself warned.") d:add_button("DELETE CURRENT FILE PERMANENTLY FROM DISK WITHOUT ASKING", delete) d:show() end -- Deactivation hook function deactivate() vlc.msg.dbg("[Diskdelete] Deactivated") vlc.deactivate() end function close() deactivate() end --[[ The file deletion routine ]] function delete() item = vlc.input.item() -- get the current playing file uri = item:uri() -- extract it's URI filename = vlc.strings.decode_uri(uri) -- decode %foo stuff from the URI vlc.playlist.skip(1) --[[ --vlc.misc.mwait(vlc.misc.mdate() + 3000000) --vlc.var.add_callback(vlc.object.input(), "time", vlc.playlist.skip(1), 3000000) ]]-- --retval, err = os.chmod(filename, 0777) filename = string.sub(filename,9) -- remove 'file://' prefix which is 7 chars long vlc.msg.dbg("[Diskdelete] selected for deletion: " .. filename) retval, err = os.remove(filename) -- delete the file with this filename from disk if(retval == nil) -- error handling; if deletion failed, print why then vlc.msg.dbg("[Diskdelete] error: " .. err) end end -- This empty function is there, because vlc pested me otherwise function meta_changed() end

Re: Delete current file from harddisk

Posted: 01 Mar 2013 16:21
by mederi
Window does not allow to delete files currently in use by VLC. The extension script probably works only on Linux.

Re: Delete current file from harddisk

Posted: 01 Mar 2013 16:51
by 147852369
This is why I wrote "vlc.playlist.skip(1)" before deleting the file to unblock the file.

If I skip the file manually, after then delete the file through the windows explorer, it works! Why not with a script?

Re: Delete current file from harddisk

Posted: 01 Mar 2013 18:54
by mederi
It seems that it is not possible to delete anything using the Lua script.
os.remove() does not work. "Permission denied".

Re: Delete current file from harddisk

Posted: 02 Mar 2013 00:25
by 147852369
Is there an other oppertunity to programming a extension for the VLC player to delete current video files from harddisk under Windows? Should I use an other programming language?

Re: Delete current file from harddisk

Posted: 02 Mar 2013 01:32
by 147852369
It works on Debian.
How can I delete a file from the PLAYLIST with LUA?

Re: Delete current file from harddisk

Posted: 02 Mar 2013 22:09
by mederi
It seems that it is not possible to delete anything using the Lua script.
os.remove() does not work. "Permission denied".
It works if a file has not read-only attribute and it is not currently used by VLC. The script does not wait until "vlc.playlist.skip(1)" releases the current file.

I have a working 2-button solution for you:

Code: Select all

function descriptor() return { title = "Diskdelete (2 buttons)" } end function activate() d = vlc.dialog("Diskdelete") label=d:add_label("<b>Clicking</b> this button will <b>delete</b> the currently playing file <b>from disk</b>.<br>You have to <b>be sure</b> as <b>you won't be asked</b> again!<br>You are responsible for your own actions, consider yourself warned.",1,1,2,1) d:add_button("SELECT CURRENT FILE", click_select,1,2) d:add_button("DELETE SELECTED FILE", click_delete,2,2) d:show() vlc.msg.info("[Diskdelete] Activated") end function deactivate() vlc.msg.info("[Diskdelete] Deactivated") end function close() vlc.deactivate() end function meta_changed() end function click_select() item = vlc.input.item() -- get the current playing file uri = item:uri() -- extract it's URI vlc.playlist.skip(1) filename = vlc.strings.decode_uri(uri) -- decode %foo stuff from the URI filename = string.sub(filename,9) -- remove 'file://' prefix which is 7 chars long filepath = string.gsub(filename,"/","\\") -- Windows style path, e.g. c:\mp3\the best.mp3 vlc.msg.info("[Diskdelete] selected for deletion: " .. filename) label:set_text(filepath) end function click_delete() if filename~=nil then retval, err = os.remove(filename) if(retval == nil) -- error handling; if deletion failed, print why then label:set_text(tostring(err)) vlc.msg.info("[Diskdelete] error: " .. tostring(err)) else label:set_text(filepath.."<br /><b>DELETED!</b>") end filename=nil end end
Issues to solve:
* 1-button solution using "capabilities = {"input-listener", "meta-listener", "playing-listener"}" and probably also some callback. Already playing next item? => Possible to delete previous one.
* write the list of files not possible to delete - read-only files
* if there is one item in the playlist, then stop playback instead of trying to play next one - itself
* remove deleted files also from actual playlist - Playlist Cleaner - "vlc.playlist.delete()"

Are you the author of Diskdelete extension script?
If you do not mind I will try to move this topic (starting from the second post here) in Lua scripting section on the forum.

Re: Delete current file from harddisk

Posted: 02 Mar 2013 22:31
by 147852369
Hey, very thanks.

I will look at this script in the next time.

No, I'm not the author of this script.

It would be nice, if there was a hotkey to delete the current file and a button next to the play button.

Re: Delete current file from harddisk

Posted: 03 Mar 2013 13:01
by mederi
For adding custom hotkeys in extension, please check following extension: Previous frame

Code: Select all

... function activate() vlc.var.add_callback( vlc.object.libvlc(), "key-pressed", key_press_handler ) end ... function key_press_handler( var, old, new, data ) if new==custom_key_code then -- do something end end ...

Re: Delete current file from harddisk

Posted: 20 Jul 2013 00:36
by 147852369
I am trying to code a version for Windows.
But I have issues in my code. I don't know why

Code: Select all

vlc.playlist.current()
select the NEXT file in the playlist and not the current.
If I click on the "mark" button to call the mark() function, VLC crashes.

Code: Select all

--[[ INSTALLATION (create directories if they don't exist): - 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\ - Restart VLC. ]]-- --[[ Extension description ]] function descriptor() return { title = "Diskdelete for Windows" ; version = "0.1" ; author = "Caglar Yanik" ; shortdesc = "DELETE current playing FILE FROM DISK for WINDOWS"; description = "<h1>Diskdelete</h1>" .. "Windows does not delete files because of write permissions. " .. "<br>This extension saves the paths of the files to be deleted in a text file," .. "<br>then reads the batch file and deletes the files on CMD." .. "<br>It will not use the Recycle Bin, the file will be gone immediately!" .. "<br>This extension has been tested on Windows 7 64 bit with VLC 2.0.7." .. "<br>The author is not responsible for damage caused by this extension."; url = "" } end --[[ Hooks ]] -- Activation hook function activate() vlc.msg.dbg("[Diskdelete] Activated") d = vlc.dialog("Diskdelete") d:add_label("<b>Zum Löschen freigeben?</b>") d:add_button("JA, ZUM LÖSCHEN MARKIEREN!", mark) d:add_button("Next File!", nextFile) d:show() datei = io.open("C:/Users/ph/Desktop/VLC_toDelete.txt", "a+") end --activate -- Deactivation hook function deactivate() datei:close() vlc.msg.dbg("[Diskdelete for Windows] Deactivated") vlc.deactivate() end --deactivate function close() deactivate() end --close --[[ The file deletion routine ]] function mark() item = vlc.input.item() -- get the current playing file uri = item:uri() -- extract it's URI filename = vlc.strings.decode_uri(uri) -- decode %foo stuff from the URI filename = string.sub(filename,9) -- remove 'file://' prefix which is 8 chars long -- 9 on Windows filename = string.gsub(filename, "/", "\\") -- / replace \ for batch-file vlc.msg.dbg("[Diskdelete] selected for deletion: " .. filename) retval, err = datei:write(filename .. "\n") if(retval == nil) -- if write failed, print why then vlc.msg.dbg("[Diskdelete] error: " .. err) errord = io.open("C:/Users/ph/Desktop/VLC_toDeleteERRORS.txt", "a+") errord:write(filename .. "\t" .. err .. "\n") errord:close() else currentID = vlc.playlist.current() vlc.playlist.delete(currentID) nextFile() filename=nil currentID=nil end --if end --mark function nextFile() vlc.playlist.skip(1) end --next -- This empty function is there, because vlc pested me otherwise function meta_changed() end

Re: Delete current file from harddisk

Posted: 21 Jul 2013 13:42
by mederi
Then use currentID-1.
There is also an issue: if you remove actual item from playlist, it does not play next file. It is just like you would press Stop and then try to press Next button. Or try to manually delete currently playing item in the playlist (mark item with mouse, then press Delete keyboard key), then press Next button.

Re: Delete current file from harddisk

Posted: 22 Jul 2013 23:00
by 147852369
I've tried currentID-1. You're right with that issue.
Your suggestion is that what I wanna avoid with this script to work efficient.
I just want to click on "Delete", which deletes the current file from the playlist and writes its path in a text-doc.

Re: Delete current file from harddisk

Posted: 23 Jul 2013 12:28
by mederi
Try to use function meta_changed() to delete items in playlist and files from harddisk. The function is automatically called several times when starting to play an item and once at the end of it. Just compare currentID with newID: if newID does not equal to currentID, then VLC is already playing another item and so it is possible to delete previous item/file (currentID). I think it is possible to do it this way.

Re: Delete current file from harddisk

Posted: 23 Jul 2013 20:39
by 147852369
I'm fed up. :D Maybe I will try to programme this next time. My extension works fine for me at the moment without the feature to delete the playlist. Whatever.

Re: Delete current file from harddisk

Posted: 24 Jul 2013 18:56
by mederi
O.K. And what do you do with the generated list of paths "VLC_toDelete.txt" that is available as soon as the extension is closed (deactivated)?

Re: Delete current file from harddisk

Posted: 01 Jan 2014 23:15
by 147852369
Sorry for late posting.
I wrote a batch file, that reads the lines of VLC_toDelete.txt and delete the files in CMD. That works fine in Windows.

Re: Delete current file from harddisk

Posted: 09 Jan 2014 14:49
by mederi
Let meta_changed() do the deleting of current item when starting the next one. Try this:

Code: Select all

function descriptor() return { title = "Diskdelete for Windows", capabilities = {"meta-listener"} } end function activate() vlc.msg.dbg("[Diskdelete] Activated") d = vlc.dialog("Diskdelete") label=d:add_label("<b>Diskdelete</b>",1,1,2,1) d:add_button("Play Next", play_Next,1,2) d:add_button("Delete", click_Delete,2,2) d:show() end function deactivate() vlc.msg.dbg("[Diskdelete for Windows] Deactivated") end function close() vlc.deactivate() end counter=0 function meta_changed() vlc.msg.info("[Diskdelete] meta_changed: " .. os.clock()) newID = vlc.playlist.current() if currentID and currentID~=newID then counter=counter+1 if counter==4 then vlc.playlist.delete(currentID-1) currentID=nil counter=0 Delete_file() end end end function click_Delete() item = vlc.input.item() status = vlc.playlist.status() if item and (status=="playing" or status=="paused") then uri = item:uri() filename = vlc.strings.decode_uri(uri) filename = string.sub(filename,9) filename = string.gsub(filename, "/", "\\") vlc.msg.dbg("[Diskdelete] selected for deletion: " .. filename) currentID = vlc.playlist.current() play_Next() end end function play_Next() vlc.playlist.next() end function Delete_file() if filename~=nil then retval, err = os.remove(filename) if(retval == nil) -- error handling; if deletion failed, print why then label:set_text(tostring(err)) vlc.msg.info("[Diskdelete] error: " .. tostring(err)) else label:set_text(filename.."<br /><b>DELETED!</b>") end filename=nil end end

Re: Delete current file from harddisk

Posted: 11 Jan 2014 17:19
by yoestiee
In how much time this feature will be coded ? Can't wait for it !!!

Re: Delete current file from harddisk

Posted: 11 Jan 2014 17:23
by 147852369
I can't test your code the next time. Sorry. I won't be at home on my pc.

But what is the difference between your and my code?

@yoestiee: You can use the code. It works, but there are some issues to solve.
My code runs under older VLC versions and I use hot keys.

I will post my finally code when I'll be at home in few weeks.

Edit: Ok. I'm sorry. The difference is, that you solve the playlist issue, right?

Re: Delete current file from harddisk

Posted: 12 Jan 2014 13:55
by mederi
Yes, it really removes items from playlist in VLC and also deletes files. Now somebody could gather all ideas into one universal extension (Windows&Linux; options: direct delete if possible, list only, batch, ...). :)
I wrote a batch file, that reads the lines of VLC_toDelete.txt and delete the files in CMD.
Can you share it?

Re: Delete current file from harddisk

Posted: 12 Jan 2014 19:50
by yoestiee
I would say move to recycle bin, most programs do this...

Re: Delete current file from harddisk

Posted: 13 Jan 2014 20:12
by 147852369
That's fine.
I'm not at home.
But the batch file was like this:

Code: Select all

@ECHO OFF &SETLOCAL FOR /f "delims=" %%a IN (VLC_toDelete.txt) DO ( IF EXIST "%%~a" ( DEL "%%~a" 2>&1 |findstr . >nul &&echo %%a wurde nicht gelöscht. || echo %%a erfolgreich gelöscht. ) ELSE ( ECHO %%a nicht gefunden. ) )

Or this:

Code: Select all

:: Diese Batch-Datei gehört zu "Diskdelete for Windows". Diskdelete for Windows speichert die Pfade der zu löschenden Bilder in einer Textdatei. :: Diskdelete kann unter Windows die Dateien nicht direkt von der Festplatte löschen, da Windows diese nicht freigibt, weil sie gerade in Verwendung sind. Unter Linux funktioniert Disklete. :: Deswegen habe ich Diskdelete so modifiziert, dass die zu löschenden Dateien letztendlich über CMD gelöscht werden können. :: TO-DO: error-log, delete line of successfull deleted files, Error = color red @ECHO OFF &SETLOCAL title DiskdeleteForWindowsBatch set PFAD=C:\Users\ph\Desktop\VLC_toDelete.txt FOR /f "delims=" %%a IN (%PFAD%) DO ( IF EXIST "%%~a" ( DEL "%%~a" /F /Q 2>&1 |findstr . >nul &&echo %%a wurde nicht gel”scht. || echo %%a erfolgreich gel”scht. ) ELSE ( ECHO %%a nicht gefunden. ) ) echo. echo. echo. echo Drcke eine beliebige Taste, um die Konsole zu schlieáen... pause > NUL

Re: Delete current file from harddisk

Posted: 16 Jan 2014 17:03
by yoestiee
This will be implemented in next version of VLC ?

Re: Delete current file from harddisk

Posted: 16 Jan 2014 17:06
by 147852369
No. Sorry. This is just an extension which you have to install by yourself. At the moment it works just in older VLC versions because of LUA.

Re: Delete current file from harddisk

Posted: 18 Jan 2014 13:13
by mederi
Dankeschön :)
The list of chosen files is actually m3u playlist. It could be used also for other purposes, for example for copying files to a destination directory: https://forum.videolan.org/viewtopic.ph ... 88#p395688
This could be another function of an "universal" VLC Extension. In this case a sum of file sizes would be a useful information.