init
This commit is contained in:
@@ -0,0 +1,86 @@
|
||||
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
|
||||
Reference in New Issue
Block a user