User Tools

Site Tools


howto:vlc-playlist-from-file

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
howto:vlc-playlist-from-file [2021/12/28 14:39] Wulf Rajekhowto:vlc-playlist-from-file [2023/05/29 11:55] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +====== VLC ======
 +
 +====== VLC no audio ======
 +
 +Change output module in Tools -> Preferences -> Audio from Auto to Pulseaudio or Alsa.
 +
 +alternative edit config file:
 +<code>
 +vi ~/.config/vlc/vlcrc
 +</code>
 +<code>
 +# Audio output module (string)
 +aout=pulse
 +</code>
 +
 +====== Associate VLC to webm videos ======
 +Gnome uses two lists to register applications to file types located in:
 +  * /usr/share/applications/mimeinfo.cache
 +  * /usr/share/applications/defaults.list
 +  * ~/.local/share/applications/mimeinfo.cache
 +<code>
 +#manually
 +sudo vi /usr/share/applications/mimeinfo.cache
 +sudo vi /usr/share/applications/defaults.list
 +vi ~/.local/share/applications/mimeinfo.cache
 +
 +#or via sed:
 +sudo sed -i 's#video/webm=#video/webm=vlc.desktop;#' /usr/share/applications/defaults.list
 +sudo sed -i 's#video/webm=#video/webm=vlc.desktop;#' /usr/share/applications/meminfo.cache
 +sudo sed -i 's#audio/webm=#audio/webm=vlc.desktop;#' /usr/share/applications/meminfo.cache
 +sed -i 's#video/webm=#video/webm=vlc.desktop;#' ~/.local/share/applications/meminfo.cache
 +sed -i 's#audio/webm=#audio/webm=vlc.desktop;#' ~/.local/share/applications/meminfo.cache
 +</code>
 +
 +
 ====== VLC Playlist from file ====== ====== VLC Playlist from file ======
  
Line 11: Line 46:
  
 You may want to activate the loop option in VLC preferences if VLC is configured to play the next track automatically. (Tools -> Preferences -> Show all settings -> Playlist -> Repeat current item) You may want to activate the loop option in VLC preferences if VLC is configured to play the next track automatically. (Tools -> Preferences -> Show all settings -> Playlist -> Repeat current item)
 +
 +or edit ~/.config/vlc/vlcrc:
 +<code>
 +vi ~/.config/vlc/vlcrc
 +</code>
 +<code>
 +# Repeat current item (boolean)
 +repeat=1
 +</code>
  
 ==== Linux ==== ==== Linux ====
 Copy vlc.sh in ~/.local/bin directory and mark it executable, then copy the desktop file of VLC /usr/share/applications/vlc.desktop to ~/.local/share/applications/vlc.desktop and change the field Exec to the path of vlc.sh (remove argument --started-from-file %U). Known extensions are stocked in variable $extensions. Copy vlc.sh in ~/.local/bin directory and mark it executable, then copy the desktop file of VLC /usr/share/applications/vlc.desktop to ~/.local/share/applications/vlc.desktop and change the field Exec to the path of vlc.sh (remove argument --started-from-file %U). Known extensions are stocked in variable $extensions.
 +<code>
 +sed -i 's#Exec=/usr/bin/vlc --started-from-file %U#Exec=/home/'$USER'/.local/bin/vlc.sh#' /usr/share/applications/vlc.desktop > ~/.local/share/applications/vlc.desktop
 +</code>
  
- +note: source from github adjusted to sort numbers as Versions like nemo file manager does. 
-<code ~/.local/bin/vlc.sh>+<code bash ~/.local/bin/vlc.sh>
 #!/bin/bash #!/bin/bash
  
 +shopt -s nocaseglob
 shopt -s extglob shopt -s extglob
-extensions='@(avi|mp4|mkv|m4v|mov|mpg|mpeg|wmv|ogg|flac|m4a|mp3|wav)'  # list of extensions for searching in current directory+extensions='@(avi|mp4|mkv|m4v|mov|mpg|mpeg|wmv|ogg|flac|m4a|mp3|wav|webm|rmvb|asf|flv)'  # list of extensions for searching in current directory
  
 # kill other instances of vlc to keep playlist clean (one-instance mode) # kill other instances of vlc to keep playlist clean (one-instance mode)
Line 27: Line 75:
 # launch empty vlc if no argument provided # launch empty vlc if no argument provided
 if [ -z "$1" ]; then if [ -z "$1" ]; then
- vlc; exit+    vlc; exit
 fi fi
  
Line 36: Line 84:
  
 # count files with matching extension, and get position of filename in current directory # count files with matching extension, and get position of filename in current directory
-n=$(ls "${dirname}"/*.${extensions} -1 2>/dev/null | wc -l) +n=$(ls "${dirname}"/*.${extensions} -1 2>/dev/null | sort -f -V | wc -l) 
-pos=$(ls "${dirname}"/*.${extensions} -1 2>/dev/null | grep -n -F -- "${basename}" | cut -d: -f1)+pos=$(ls "${dirname}"/*.${extensions} -1 2>/dev/null | sort -f -V | grep -n -F -- "${basename}" | cut -d: -f1)
  
 # if the filename does not have one of the extension above, launch vlc with provided filename # if the filename does not have one of the extension above, launch vlc with provided filename
 if [ -z "$pos" ]; then if [ -z "$pos" ]; then
- vlc -- "${filename}" +    vlc -- "${filename}" 
- exit+    exit
 fi fi
  
 # change positions in playlist such as the first element is the opened file # change positions in playlist such as the first element is the opened file
-ls "${dirname}"/*.${extensions} -1 | tail -n$(($n-$pos+1)) >  /tmp/vlc.m3u +ls "${dirname}"/*.${extensions} -1 | sort -f -V | tail -n$(($n-$pos+1)) >  /tmp/vlc.m3u 
-ls "${dirname}"/*.${extensions} -1 | head -n$(($pos-1))    >> /tmp/vlc.m3u+ls "${dirname}"/*.${extensions} -1 | sort -f -V | head -n$(($pos-1))    >> /tmp/vlc.m3u
  
 # launch playlist # launch playlist
-IFS=$'\n'; read -d '' -r -a files < /tmp/vlc.m3u; vlc "${files[@]}"+IFS=$'\n'; read -d '' -r -a files < /tmp/vlc.m3u; vlc --norandom "${files[@]}"
 </code> </code>
  
Line 73: Line 121:
 powershell -File %USERPROFILE%\vlc.ps1 %1 powershell -File %USERPROFILE%\vlc.ps1 %1
 </code> </code>
-<code vlc.ps1>+<code powershell vlc.ps1>
 Param([string]$filename) Param([string]$filename)
  
Line 104: Line 152:
 & $vlcPath $(Get-Content $Env:TMP\vlc.m3u) & $vlcPath $(Get-Content $Env:TMP\vlc.m3u)
 </code> </code>
 +
 +
 +====== VLC Delete file option ======
 +
 +So put the file in ~/.local/share/vlc/lua/extensions. I call it DeleteFile.lua.
 +
 +When you start VLC you get a new menu item: View > Detetefile. It is this last step I was missing.
 +
 +It now searches for a dir called .waste in the dir of the file and any (grand*)parent dirs, and moves the file there. So you need to create a dir called .waste.
 +
 +When you start VLC you get a new menu item: View > Move currently playing file into wastebasket.
 +
 +<code lua WasteBasket.lua>
 +--[[
 +INSTALLATION (create directories if they do not 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.
 +- The extension can then be found in the menu:
 +    View > Move current playing file into wastebasket
 +]]--
 +
 +--[[ Extension description ]]
 +
 +function descriptor()
 +  return { title = "Wastebasket" ;
 +    version = "0.10" ;
 +    author = "Mark Morschhäuser/Ole Tange/Wulf Rajek" ;
 +    shortdesc = "Move current playing file into wastebasket";
 +    description = "<h1>Wastebasket</h1>"
 +    .. "When you're playing a file, use Wastebasket to "
 +    .. "easily move this file to a .waste-dir with one click. "
 +    .. "<br>This will NOT change your playlist, it will move the file itself. "
 +    .. "<br>Wastebasket will search for a dir called .waste "
 +    .. "in the dir of the file and all parent dirs of that.";
 +    url = "https://gitlab.com/ole.tange/tangetools/tree/master/wastebasket"
 +  }
 +end
 +
 +--[[ Hooks ]]
 +
 +-- Activation hook
 +function activate()
 +  local filename,dst,wdir = filename_dst_wastedir()
 +  -- create waste directory if it doesn't exist
 +  if(not directory_exists(wdir)) then
 +    -- escaping single quote while surrounding dir in single quotes for dirs with spaces
 +    os.execute("mkdir '" .. string.gsub(dirname(filename) .. wdir, "\'", "\\\\'" ) .. "'")
 +    wdir = dirname(filename) .. wdir
 +  end
 +  if(directory_exists(wdir)) then
 +    d = vlc.dialog("Wastebasket")
 +    d:add_label("Move <b>".. filename .. "</b> to <b>" .. wdir .. "</b>?")
 +    d:add_button("Move", delete)
 +    d:add_button("Cancel", close)
 +    d:show()
 +  else
 +    d = vlc.dialog("Wastebasket - no dir found")
 +    d:add_label(".waste is not found anywhere in parent dirs")
 +    d:add_button("Cancel", close)
 +    d:show()
 +  end
 +  vlc.msg.dbg("[Wastebasket] Activated")
 +end
 +
 +function filename_dst_wastedir()
 +  -- get the current playing file
 +  local item = vlc.input.item()
 +  -- extract its URI
 +  local uri = item:uri()
 +  -- decode %foo stuff from the URI
 +  local filename = vlc.strings.decode_uri(uri)
 +  -- remove 'file://' prefix which is 7 chars long
 +  filename = string.sub(filename,8)
 +
 +  -- find .waste in parent dirs
 +  local wdir = wastedir(dirname(filename))
 +  return filename,wdir .. "/" .. basename(filename),wdir
 +end
 +
 +function wastedir(dir)
 +  -- recursively search for .waste in parent dir
 +
 +  vlc.msg.dbg("[Wastebasket/wastedir] Looking at " .. dir)
 +  local wdir = dir .. "/" .. ".waste"
 +  if directory_exists(wdir) then
 +     vlc.msg.dbg("[Wastebasket/wastedir] Found wastedir: " .. wdir)
 +     return wdir
 +  end
 +  -- try the parent dir
 +  local parent = dirname(dir)
 +  if(parent == dir) then
 +    -- we have reached root (/)
 +    -- return wdir (which does not exist)
 +    return wdir
 +  end
 +  vlc.msg.dbg("[Wastebasket/wastedir] parent " .. parent)
 +  if directory_exists(parent) then
 +    return wastedir(parent)
 +  else
 +    return parent
 +  end
 +end
 +
 +function directory_exists(dir)
 +  -- Simple checker if dir exists
 +  -- shell quote the dirname
 +  dir, _ = dir:gsub("([\002-\009\011-\026\\#?`(){}%[%]^*<>=~|; \"!$&'\130-\255])", "\\%1")
 +  dir, _ = dir:gsub("\n", "'\n'")
 +  return os.execute("cd " .. dir)
 +end
 +
 +function deactivate()
 +  -- Deactivation hook
 +  vlc.msg.dbg("[Wastebasket] Deactivated")
 +  vlc.deactivate()
 +end
 +
 +function close()
 +  deactivate()
 +end
 +
 +--- Function equivalent to basename in POSIX systems
 +--@param str the path string
 +function basename(str)
 +  local name = string.gsub(str, "(.*/)(.*)", "%2")
 +  return name
 +end
 +
 +function dirname(str)
 +  local name = string.gsub(str, "(.*)/(.*)", "%1")
 +  return name
 +end
 +
 +function delete()
 +  local filename,dst,wdir = filename_dst_wastedir()
 +  if(directory_exists(wdir)) then
 +    vlc.msg.dbg("[Wastebasket]: Move to " .. dst)
 +    local retval, err = os.rename(filename,dst)
 +    if(retval == nil) then
 +      -- error handling; if moving failed, print why
 +      vlc.msg.dbg("[Wastebasket] error: " .. err)
 +    end
 +  else
 +    d = vlc.dialog("Wastebasket - no dir found")
 +    d:add_label(".waste is not found anywhere in parent dirs")
 +    d:add_button("Cancel", close)
 +    d:show()
 +  end
 +  close()
 +end
 +
 +-- This empty function is there, because vlc pested me otherwise
 +function meta_changed()
 +end
 +
 +</code>
 +
 +https://github.com/surrim/vlc-delete/
 +<code lua delete.lua>
 +--[[
 + Copyright 2015-2019 surrim
 +
 + This program is free software: you can redistribute it and/or modify
 + it under the terms of the GNU General Public License as published by
 + the Free Software Foundation, either version 3 of the License, or
 + (at your option) any later version.
 +
 + This program is distributed in the hope that it will be useful,
 + but WITHOUT ANY WARRANTY; without even the implied warranty of
 + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 + GNU General Public License for more details.
 +
 + You should have received a copy of the GNU General Public License
 + along with this program.  If not, see <http://www.gnu.org/licenses/>.
 +]]--
 +
 +function descriptor()
 + return {
 + title = "VLC Delete";
 + version = "0.1";
 + author = "surrim";
 + url = "https://github.com/surrim/vlc-delete/";
 + shortdesc = "&Remove current file from playlist and disk";
 + description = [[
 +<h1>vlc-delete</h1>"
 +When you're playing a file, use VLC Delete to
 +delete the current file from your playlist and <b>disk</b> with one click.<br>
 +This extension has been tested on GNU Linux with VLC 2.1.5.<br>
 +The author is not responsible for damage caused by this extension.
 + ]];
 + }
 +end
 +
 +function fileExists(file)
 + return io.popen("if exist " .. file .. " (echo 1)") : read "*l" == "1"
 +end
 +
 +function sleep(seconds)
 + local t0 = os.clock()
 + local tOriginal = t0
 + while os.clock() - t0 <= seconds and os.clock() >= tOriginal do end
 +end
 +
 +function windowsDelete(file, trys, pause)
 + if not fileExists("\"" .. file .. "\"") then return nil, "File does not exist" end
 + for i = trys, 1, -1
 + do
 + retval, err = os.remove(file)
 + --retval, err = os.execute("del " .. file )
 + if retval == true then
 + return true
 + end
 + sleep(pause)
 + end
 + return {nil, "Unable to delete file"}
 +end
 +
 +function removeItem()
 + local id = vlc.playlist.current()
 + vlc.playlist.delete(id)
 + vlc.playlist.gotoitem(id + 1)
 + vlc.deactivate()
 +end
 +
 +function activate()
 + local item = vlc.input.item()
 + local uri = item:uri()
 + uri = string.gsub(uri, "^file:///", "")
 + uri = vlc.strings.decode_uri(uri)
 + vlc.msg.info("[vlc-delete] removing: " .. uri)
 +
 + if (package.config:sub(1, 1) == "/") then -- not windows
 + retval, err = os.execute("trash-put --help > /dev/null")
 + if (retval ~= nil) then
 + uri = "/" .. uri
 + retval, err = os.execute("trash-put \"" .. uri .. "\"")
 + else
 + retval, err = os.execute("rm --help > /dev/null")
 + if (retval ~= nil) then
 + uri = "/" .. uri
 + retval, err = os.execute("rm \"" .. uri .. "\"")
 + end
 + end
 + if (retval ~= nil) then removeItem() end
 + else -- windows
 + removeItem() -- remove from playlist first so the file isnt locked by vlc
 + uri = string.gsub(uri, "/", "\\")
 + retval, err = windowsDelete(uri, 3, 1)
 + end
 +
 + if (retval == nil) then
 + vlc.msg.info("[vlc-delete] error: " .. err)
 + d = vlc.dialog("VLC Delete")
 + d:add_label("Could not remove \"" .. uri .. "\"", 1, 1, 1, 1)
 + d:add_label(err, 1, 2, 1, 1)
 + d:add_button("OK", click_ok, 1, 3, 1, 1)
 + d:show()
 + end
 +end
 +
 +function click_ok()
 + d:delete()
 + vlc.deactivate()
 +end
 +
 +function deactivate()
 + vlc.deactivate()
 +end
 +
 +function close()
 + deactivate()
 +end
 +
 +function meta_changed()
 +end
 +</code>
 +
 +https://superuser.com/questions/721112/vlc-how-to-delete-file-on-disk
 +
 +
  
howto/vlc-playlist-from-file.1640702397.txt.gz · Last modified: 2023/05/29 11:53 (external edit)