From 35737cbef4f464429552f448a6cef06f26aca9b2 Mon Sep 17 00:00:00 2001 From: Guido Cella Date: Fri, 10 Jan 2025 10:36:22 +0100 Subject: [PATCH] select.lua: select from the watch history with g-h Implement selection of the entries in the watch history. The last entry in the selector deletes the history file. --- DOCS/man/mpv.rst | 3 ++ DOCS/man/options.rst | 3 +- etc/input.conf | 1 + player/lua/select.lua | 78 +++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 84 insertions(+), 1 deletion(-) diff --git a/DOCS/man/mpv.rst b/DOCS/man/mpv.rst index 7c67cf0d96d18..ecb54f42abec9 100644 --- a/DOCS/man/mpv.rst +++ b/DOCS/man/mpv.rst @@ -328,6 +328,9 @@ g-l g-d Select an audio device. +g-h + Select a file from the watch history. Requires ``--save-watch-history``. + g-w Select a file from watch later config files (see `RESUMING PLAYBACK`_) to resume playing. Requires ``--write-filename-in-watch-later-config``. This diff --git a/DOCS/man/options.rst b/DOCS/man/options.rst index 1a172495d50ab..79f4376df559c 100644 --- a/DOCS/man/options.rst +++ b/DOCS/man/options.rst @@ -1152,7 +1152,8 @@ Watch History ------------- ``--save-watch-history`` - Whether to save which files are played. + Whether to save which files are played. These can be then selected with the + default ``g-h`` key binding. .. warning:: diff --git a/etc/input.conf b/etc/input.conf index 2faa88c233b28..adbb824a0d838 100644 --- a/etc/input.conf +++ b/etc/input.conf @@ -187,6 +187,7 @@ #g-e script-binding select/select-edition #g-l script-binding select/select-subtitle-line #g-d script-binding select/select-audio-device +#g-h script-binding select/select-watch-history #g-w script-binding select/select-watch-later #g-b script-binding select/select-binding #g-r script-binding select/show-properties diff --git a/player/lua/select.lua b/player/lua/select.lua index 7f20602aff098..81479e0c1cdc7 100644 --- a/player/lua/select.lua +++ b/player/lua/select.lua @@ -18,6 +18,13 @@ License along with mpv. If not, see . local utils = require "mp.utils" local input = require "mp.input" +local options = { + history_date_format = "%Y-%m-%d %H:%M:%S", + hide_history_duplicates = true, +} + +require "mp.options".read_options(options, nil, function () end) + local function show_warning(message) mp.msg.warn(message) if mp.get_property_native("vo-configured") then @@ -353,6 +360,77 @@ mp.add_key_binding(nil, "select-audio-device", function () }) end) +local function format_history_entry(entry) + local status + status, entry.time = pcall(os.date, options.history_date_format, entry.time) + + if not status then + mp.msg.warn(entry.time) + end + + return "(" .. entry.time .. ") " .. + (entry.title or select(2, utils.split_path(entry.path))) .. + " (" .. entry.path .. ")" +end + +mp.add_key_binding(nil, "select-watch-history", function () + local history_file_path = mp.command_native( + {"expand-path", mp.get_property("watch-history-path")}) + local history_file, error_message = io.open(history_file_path) + if not history_file then + show_warning(mp.get_property_native("save-watch-history") + and error_message + or "Enable --save-watch-history") + return + end + + local all_entries = {} + local line_num = 1 + for line in history_file:lines() do + local entry = utils.parse_json(line) + if entry and entry.path then + all_entries[#all_entries + 1] = entry + else + mp.msg.warn(history_file_path .. ": Parse error at line " .. line_num) + end + line_num = line_num + 1 + end + history_file:close() + + local entries = {} + local items = {} + local seen = {} + + for i = #all_entries, 1, -1 do + local entry = all_entries[i] + if not seen[entry.path] or not options.hide_history_duplicates then + seen[entry.path] = true + entries[#entries + 1] = entry + items[#items + 1] = format_history_entry(entry) + end + end + + items[#items+1] = "Clear history" + + input.select({ + prompt = "Select a file:", + items = items, + submit = function (i) + if entries[i] then + mp.commandv("loadfile", entries[i].path) + return + end + + error_message = select(2, os.remove(history_file_path)) + if error_message then + show_error(error_message) + else + mp.osd_message("History cleared.") + end + end, + }) +end) + mp.add_key_binding(nil, "select-watch-later", function () local watch_later_dir = mp.get_property("current-watch-later-dir")