87 lines
2.5 KiB
Lua
87 lines
2.5 KiB
Lua
local msg = require 'mp.msg'
|
|
local utils = require 'mp.utils'
|
|
local fb = require 'file-browser'
|
|
|
|
local parser = {
|
|
priority = 105,
|
|
api_version = '1.2.0'
|
|
}
|
|
|
|
-- stores a table of the parsers loaded by file-browser
|
|
-- we will use this to check if a parser is for a local file system
|
|
local parsers
|
|
|
|
local sort_mode = 0
|
|
|
|
function parser:setup()
|
|
parsers = fb.get_parsers()
|
|
end
|
|
|
|
function parser:parse(directory)
|
|
if sort_mode == 0 or fb.get_protocol(directory) then return end
|
|
local list, opts = self:defer(directory)
|
|
if not list then return list, opts end
|
|
|
|
-- Only run this on parsers that are for the local filesystem.
|
|
-- We assume that custom addons for the local filesystem are setting the keybind_name field to 'file'
|
|
-- for compatability.
|
|
if parsers[opts.id] then
|
|
if parsers[opts.id].keybind_name ~= 'file' and parsers[opts.id].name ~= 'file' then
|
|
return list, opts
|
|
end
|
|
end
|
|
|
|
directory = opts.directory or directory
|
|
local cache = {}
|
|
|
|
-- gets the file info of an item
|
|
-- uses memoisation to speed things up
|
|
function get_file_info(item)
|
|
if cache[item] then return cache[item] end
|
|
|
|
local path = fb.get_full_path(item, directory)
|
|
local file_info = utils.file_info(path)
|
|
if not file_info then
|
|
msg.warn('failed to read file info for', path)
|
|
return {}
|
|
end
|
|
|
|
cache[item] = file_info
|
|
return file_info
|
|
end
|
|
|
|
-- sorts the items based on the latest modification time
|
|
-- if mtime is undefined due to a file read failure then use 0
|
|
table.sort(list, function(a, b)
|
|
-- `dir` will compare as less than `file`
|
|
if a.type ~= b.type then return a.type < b.type end
|
|
if sort_mode == 1 then
|
|
return (get_file_info(a).mtime or 0) < (get_file_info(b).mtime or 0)
|
|
elseif sort_mode == 2 then
|
|
return (get_file_info(a).mtime or 0) > (get_file_info(b).mtime or 0)
|
|
elseif sort_mode == 3 then
|
|
return (get_file_info(a).size or 0) < (get_file_info(b).size or 0)
|
|
elseif sort_mode == 4 then
|
|
return (get_file_info(a).size or 0) > (get_file_info(b).size or 0)
|
|
end
|
|
end)
|
|
|
|
opts.sorted = true
|
|
return list, opts
|
|
end
|
|
|
|
-- adds the keybind to toggle sorting
|
|
parser.keybinds = {
|
|
{
|
|
key = '^',
|
|
name = 'toggle_sort',
|
|
command = function()
|
|
sort_mode = sort_mode + 1
|
|
if sort_mode > 4 then sort_mode = 0 end
|
|
fb.rescan()
|
|
end
|
|
}
|
|
}
|
|
|
|
return parser
|