diff options
Diffstat (limited to '')
-rw-r--r-- | .config/alacritty/alacritty.toml | 3 | ||||
-rw-r--r-- | .config/go2work/go2work.toml | 4 | ||||
-rw-r--r-- | .config/mpv/scripts/mpv_thumbnail_script_server-1.lua | 815 | ||||
-rw-r--r-- | .config/newsboat/config | 2 | ||||
-rw-r--r-- | .config/zsh/.zshrc | 31 |
5 files changed, 36 insertions, 819 deletions
diff --git a/.config/alacritty/alacritty.toml b/.config/alacritty/alacritty.toml index 00ee46a..9cd76d4 100644 --- a/.config/alacritty/alacritty.toml +++ b/.config/alacritty/alacritty.toml @@ -62,8 +62,9 @@ x = 0 y = 0 [[hints.enabled]] -command = "linkview" +command = { program = "linkview", args = [ "-e", "linkview" ] } post_processing = true +persist = false regex = "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:..|news:|file:|git:|ssh:|ftp:)[^\u0000-\u001F\u007F-<>\"\\s{-}\\^⟨⟩`]+" [hints.enabled.binding] diff --git a/.config/go2work/go2work.toml b/.config/go2work/go2work.toml index 188e724..e57763c 100644 --- a/.config/go2work/go2work.toml +++ b/.config/go2work/go2work.toml @@ -6,7 +6,7 @@ files = [ # '/home/jozan/mu/rock/grunge/pearl_jam/2020_mtv_unplugged_live/02_state_of_love_and_trust.flac', # '/home/jozan/mu/rock/stoner_rock/slo_burn/1997_amusing_the_amazing_ep/02_muezli.flac' # '/home/jozan/mu/rock/stoner_rock/slo_burn/1997_amusing_the_amazing_ep/03_pilot_the_dune.flac' - # '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/54_meathook.flac', + '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/54_meathook.flac', # '/home/jozan/mu/rock/punk/guerilla_poubelle/2007_punk_existentialisme/10_dans_la_diagonale.flac', # '/home/jozan/mu/rock/punk/guerilla_poubelle/2005_il_faut_repeindre_le_monde_en_noir/15_exception_culturelle_trafic_darmes.flac', # '/home/jozan/mu/ost/mick_gordon/2020_doom_eternal_original_game_soundtrack/21_the_super_gore_nest.flac', @@ -15,7 +15,7 @@ files = [ # '/home/jozan/mu/metal/technical_death_metal/gojira/2016_magma/04_stranded.flac', # '/home/jozan/mu/metal/technical_death_metal/gojira/2005_form_mars_to_sirius/02_backbone.flac', # '/usr/home/jozan/mu/metal/technical_death_metal/ulcerate/2011_the_destroyers_of_all/07_the_destroyers_of_all.flac', - '/home/jozan/mu/rock/grunge/nirvana/2011_nevermind_20th_anniversary_deluxe_edition/cd_1/04_breed.flac', + # '/home/jozan/mu/rock/grunge/nirvana/2011_nevermind_20th_anniversary_deluxe_edition/cd_1/04_breed.flac', # '/home/jozan/mu/rock/grunge/alice_in_chains/1990_facelift/02_man_in_the_box.flac', # '/home/jozan/mu/rock/grunge/alice_in_chains/1992_dirt/11_angry_chair.flac', # '/home/jozan/mu/rock/grunge/alice_in_chains/1995_alice_in_chains/08_god_am.flac', diff --git a/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua b/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua deleted file mode 100644 index a91db76..0000000 --- a/.config/mpv/scripts/mpv_thumbnail_script_server-1.lua +++ /dev/null @@ -1,815 +0,0 @@ ---[[ - Copyright (C) 2017 AMM - - 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/>. -]]-- ---[[ - mpv_thumbnail_script.lua 0.5.3 - commit 6b42232 (branch master) - https://github.com/TheAMM/mpv_thumbnail_script - Built on 2023-10-19 11:12:04 -]]-- -local assdraw = require 'mp.assdraw' -local msg = require 'mp.msg' -local opt = require 'mp.options' -local utils = require 'mp.utils' - --- Determine if the platform is Windows -- -ON_WINDOWS = (package.config:sub(1,1) ~= '/') - --- Determine if the platform is MacOS -- -local uname = io.popen("uname -s"):read("*l") -ON_MAC = not ON_WINDOWS and (uname == "Mac" or uname == "Darwin") - --- Some helper functions needed to parse the options -- -function isempty(v) return not v or (v == "") or (v == 0) or (type(v) == "table" and not next(v)) end - -function divmod (a, b) - return math.floor(a / b), a % b -end - --- Better modulo -function bmod( i, N ) - return (i % N + N) % N -end - -function join_paths(...) - local sep = ON_WINDOWS and "\\" or "/" - local result = ""; - for i, p in pairs({...}) do - if p ~= "" then - if is_absolute_path(p) then - result = p - else - result = (result ~= "") and (result:gsub("[\\"..sep.."]*$", "") .. sep .. p) or p - end - end - end - return result:gsub("[\\"..sep.."]*$", "") -end - --- /some/path/file.ext -> /some/path, file.ext -function split_path( path ) - local sep = ON_WINDOWS and "\\" or "/" - local first_index, last_index = path:find('^.*' .. sep) - - if not last_index then - return "", path - else - local dir = path:sub(0, last_index-1) - local file = path:sub(last_index+1, -1) - - return dir, file - end -end - -function is_absolute_path( path ) - local tmp, is_win = path:gsub("^[A-Z]:\\", "") - local tmp, is_unix = path:gsub("^/", "") - return (is_win > 0) or (is_unix > 0) -end - -function Set(source) - local set = {} - for _, l in ipairs(source) do set[l] = true end - return set -end - ---------------------------- --- More helper functions -- ---------------------------- - --- Removes all keys from a table, without destroying the reference to it -function clear_table(target) - for key, value in pairs(target) do - target[key] = nil - end -end -function shallow_copy(target) - local copy = {} - for k, v in pairs(target) do - copy[k] = v - end - return copy -end - --- Rounds to given decimals. eg. round_dec(3.145, 0) => 3 -function round_dec(num, idp) - local mult = 10^(idp or 0) - return math.floor(num * mult + 0.5) / mult -end - -function file_exists(name) - local f = io.open(name, "rb") - if f then - local ok, err, code = f:read(1) - io.close(f) - return not code - else - return false - end -end - -function path_exists(name) - local f = io.open(name, "rb") - if f then - io.close(f) - return true - else - return false - end -end - -function create_directories(path) - local cmd - if ON_WINDOWS then - cmd = { args = {"cmd", "/c", "mkdir", path} } - else - cmd = { args = {"mkdir", "-p", path} } - end - utils.subprocess(cmd) -end - --- Find an executable in PATH or CWD with the given name -function find_executable(name) - local delim = ON_WINDOWS and ";" or ":" - - local pwd = os.getenv("PWD") or utils.getcwd() - local path = os.getenv("PATH") - - local env_path = pwd .. delim .. path -- Check CWD first - - local result, filename - for path_dir in env_path:gmatch("[^"..delim.."]+") do - filename = join_paths(path_dir, name) - if file_exists(filename) then - result = filename - break - end - end - - return result -end - -local ExecutableFinder = { path_cache = {} } --- Searches for an executable and caches the result if any -function ExecutableFinder:get_executable_path( name, raw_name ) - name = ON_WINDOWS and not raw_name and (name .. ".exe") or name - - if not self.path_cache[name] then - self.path_cache[name] = find_executable(name) or false - end - return self.path_cache[name] -end - --- Format seconds to HH.MM.SS.sss -function format_time(seconds, sep, decimals) - decimals = decimals or 3 - sep = sep or "." - local s = seconds - local h, s = divmod(s, 60*60) - local m, s = divmod(s, 60) - - local second_format = string.format("%%0%d.%df", 2+(decimals > 0 and decimals+1 or 0), decimals) - - return string.format("%02d"..sep.."%02d"..sep..second_format, h, m, s) -end - --- Format seconds to 1h 2m 3.4s -function format_time_hms(seconds, sep, decimals, force_full) - decimals = decimals or 1 - sep = sep or " " - - local s = seconds - local h, s = divmod(s, 60*60) - local m, s = divmod(s, 60) - - if force_full or h > 0 then - return string.format("%dh"..sep.."%dm"..sep.."%." .. tostring(decimals) .. "fs", h, m, s) - elseif m > 0 then - return string.format("%dm"..sep.."%." .. tostring(decimals) .. "fs", m, s) - else - return string.format("%." .. tostring(decimals) .. "fs", s) - end -end - --- Writes text on OSD and console -function log_info(txt, timeout) - timeout = timeout or 1.5 - msg.info(txt) - mp.osd_message(txt, timeout) -end - --- Join table items, ala ({"a", "b", "c"}, "=", "-", ", ") => "=a-, =b-, =c-" -function join_table(source, before, after, sep) - before = before or "" - after = after or "" - sep = sep or ", " - local result = "" - for i, v in pairs(source) do - if not isempty(v) then - local part = before .. v .. after - if i == 1 then - result = part - else - result = result .. sep .. part - end - end - end - return result -end - -function wrap(s, char) - char = char or "'" - return char .. s .. char -end --- Wraps given string into 'string' and escapes any 's in it -function escape_and_wrap(s, char, replacement) - char = char or "'" - replacement = replacement or "\\" .. char - return wrap(string.gsub(s, char, replacement), char) -end --- Escapes single quotes in a string and wraps the input in single quotes -function escape_single_bash(s) - return escape_and_wrap(s, "'", "'\\''") -end - --- Returns (a .. b) if b is not empty or nil -function joined_or_nil(a, b) - return not isempty(b) and (a .. b) or nil -end - --- Put items from one table into another -function extend_table(target, source) - for i, v in pairs(source) do - table.insert(target, v) - end -end - --- Creates a handle and filename for a temporary random file (in current directory) -function create_temporary_file(base, mode, suffix) - local handle, filename - suffix = suffix or "" - while true do - filename = base .. tostring(math.random(1, 5000)) .. suffix - handle = io.open(filename, "r") - if not handle then - handle = io.open(filename, mode) - break - end - io.close(handle) - end - return handle, filename -end - - -function get_processor_count() - local proc_count - - if ON_WINDOWS then - proc_count = tonumber(os.getenv("NUMBER_OF_PROCESSORS")) - else - local cpuinfo_handle = io.open("/proc/cpuinfo") - if cpuinfo_handle then - local cpuinfo_contents = cpuinfo_handle:read("*a") - local _, replace_count = cpuinfo_contents:gsub('processor', '') - proc_count = replace_count - end - end - - if proc_count and proc_count > 0 then - return proc_count - end -end - -function substitute_values(string, values) - local substitutor = function(match) - if match == "%" then - return "%" - else - -- nil is discarded by gsub - return values[match] - end - end - - local substituted = string:gsub('%%(.)', substitutor) - return substituted -end - --- ASS HELPERS -- -function round_rect_top( ass, x0, y0, x1, y1, r ) - local c = 0.551915024494 * r -- circle approximation - ass:move_to(x0 + r, y0) - ass:line_to(x1 - r, y0) -- top line - if r > 0 then - ass:bezier_curve(x1 - r + c, y0, x1, y0 + r - c, x1, y0 + r) -- top right corner - end - ass:line_to(x1, y1) -- right line - ass:line_to(x0, y1) -- bottom line - ass:line_to(x0, y0 + r) -- left line - if r > 0 then - ass:bezier_curve(x0, y0 + r - c, x0 + r - c, y0, x0 + r, y0) -- top left corner - end -end - -function round_rect(ass, x0, y0, x1, y1, rtl, rtr, rbr, rbl) - local c = 0.551915024494 - ass:move_to(x0 + rtl, y0) - ass:line_to(x1 - rtr, y0) -- top line - if rtr > 0 then - ass:bezier_curve(x1 - rtr + rtr*c, y0, x1, y0 + rtr - rtr*c, x1, y0 + rtr) -- top right corner - end - ass:line_to(x1, y1 - rbr) -- right line - if rbr > 0 then - ass:bezier_curve(x1, y1 - rbr + rbr*c, x1 - rbr + rbr*c, y1, x1 - rbr, y1) -- bottom right corner - end - ass:line_to(x0 + rbl, y1) -- bottom line - if rbl > 0 then - ass:bezier_curve(x0 + rbl - rbl*c, y1, x0, y1 - rbl + rbl*c, x0, y1 - rbl) -- bottom left corner - end - ass:line_to(x0, y0 + rtl) -- left line - if rtl > 0 then - ass:bezier_curve(x0, y0 + rtl - rtl*c, x0 + rtl - rtl*c, y0, x0 + rtl, y0) -- top left corner - end -end -local SCRIPT_NAME = "mpv_thumbnail_script" - -local default_cache_base = ON_WINDOWS and os.getenv("TEMP") or (os.getenv("XDG_CACHE_HOME") or "/tmp/") - -local thumbnailer_options = { - -- The thumbnail directory - cache_directory = join_paths(default_cache_base, "mpv_thumbs_cache"), - - ------------------------ - -- Generation options -- - ------------------------ - - -- Automatically generate the thumbnails on video load, without a keypress - autogenerate = true, - - -- Only automatically thumbnail videos shorter than this (seconds) - autogenerate_max_duration = 3600, -- 1 hour - - -- SHA1-sum filenames over this length - -- It's nice to know what files the thumbnails are (hence directory names) - -- but long URLs may approach filesystem limits. - hash_filename_length = 128, - - -- Use mpv to generate thumbnail even if ffmpeg is found in PATH - -- ffmpeg does not handle ordered chapters (MKVs which rely on other MKVs)! - -- mpv is a bit slower, but has better support overall (eg. subtitles in the previews) - prefer_mpv = true, - - -- Explicitly disable subtitles on the mpv sub-calls - mpv_no_sub = false, - -- Add a "--no-config" to the mpv sub-call arguments - mpv_no_config = false, - -- Add a "--profile=<mpv_profile>" to the mpv sub-call arguments - -- Use "" to disable - mpv_profile = "", - -- Hardware decoding - mpv_hwdec = "no", - -- High precision seek - mpv_hr_seek = "yes", - -- Output debug logs to <thumbnail_path>.log, ala <cache_directory>/<video_filename>/000000.bgra.log - -- The logs are removed after successful encodes, unless you set mpv_keep_logs below - mpv_logs = true, - -- Keep all mpv logs, even the succesfull ones - mpv_keep_logs = false, - - -- Disable the built-in keybind ("T") to add your own - disable_keybinds = false, - - --------------------- - -- Display options -- - --------------------- - - -- Move the thumbnail up or down - -- For example: - -- topbar/bottombar: 24 - -- rest: 0 - vertical_offset = 24, - - -- Adjust background padding - -- Examples: - -- topbar: 0, 10, 10, 10 - -- bottombar: 10, 0, 10, 10 - -- slimbox/box: 10, 10, 10, 10 - pad_top = 10, - pad_bot = 0, - pad_left = 10, - pad_right = 10, - - -- If true, pad values are screen-pixels. If false, video-pixels. - pad_in_screenspace = true, - -- Calculate pad into the offset - offset_by_pad = true, - - -- Background color in BBGGRR - background_color = "000000", - -- Alpha: 0 - fully opaque, 255 - transparent - background_alpha = 80, - - -- Keep thumbnail on the screen near left or right side - constrain_to_screen = true, - - -- Do not display the thumbnailing progress - hide_progress = false, - - ----------------------- - -- Thumbnail options -- - ----------------------- - - -- The maximum dimensions of the thumbnails (pixels) - thumbnail_width = 200, - thumbnail_height = 200, - - -- The thumbnail count target - -- (This will result in a thumbnail every ~10 seconds for a 25 minute video) - thumbnail_count = 150, - - -- The above target count will be adjusted by the minimum and - -- maximum time difference between thumbnails. - -- The thumbnail_count will be used to calculate a target separation, - -- and min/max_delta will be used to constrict it. - - -- In other words, thumbnails will be: - -- at least min_delta seconds apart (limiting the amount) - -- at most max_delta seconds apart (raising the amount if needed) - min_delta = 5, - -- 120 seconds aka 2 minutes will add more thumbnails when the video is over 5 hours! - max_delta = 90, - - - -- Overrides for remote urls (you generally want less thumbnails!) - -- Thumbnailing network paths will be done with mpv - - -- Allow thumbnailing network paths (naive check for "://") - thumbnail_network = false, - -- Same as autogenerate_max_duration but for remote videos - remote_autogenerate_max_duration = 1200, -- 20 min - -- Override thumbnail count, min/max delta - remote_thumbnail_count = 60, - remote_min_delta = 15, - remote_max_delta = 120, - - -- Try to grab the raw stream and disable ytdl for the mpv subcalls - -- Much faster than passing the url to ytdl again, but may cause problems with some sites - remote_direct_stream = true, - - -- Enable storyboards (requires yt-dlp in PATH). Currently only supports YouTube and Twitch VoDs - storyboard_enable = true, - -- Max thumbnails for storyboards. It only skips processing some of the downloaded thumbnails and doesn't make it much faster - storyboard_max_thumbnail_count = 800, - -- Most storyboard thumbnails are 160x90. Enabling this allows upscaling them up to thumbnail_height - storyboard_upscale = false, -} - -read_options(thumbnailer_options, SCRIPT_NAME) -function skip_nil(tbl) - local n = {} - for k, v in pairs(tbl) do - table.insert(n, v) - end - return n -end - -function create_thumbnail_mpv(file_path, timestamp, size, output_path, options) - options = options or {} - - local ytdl_disabled = not options.enable_ytdl and (mp.get_property_native("ytdl") == false - or thumbnailer_options.remote_direct_stream) - - local header_fields_arg = nil - local header_fields = mp.get_property_native("http-header-fields") - if #header_fields > 0 then - -- We can't escape the headers, mpv won't parse "--http-header-fields='Name: value'" properly - header_fields_arg = "--http-header-fields=" .. table.concat(header_fields, ",") - end - - local profile_arg = nil - if thumbnailer_options.mpv_profile ~= "" then - profile_arg = "--profile=" .. thumbnailer_options.mpv_profile - end - - local log_arg = "--log-file=" .. output_path .. ".log" - - local mpv_path = ON_MAC and "/opt/homebrew/bin/mpv" or "mpv" - - local mpv_command = skip_nil{ - mpv_path, - -- Hide console output - "--msg-level=all=no", - - -- Disable ytdl - (ytdl_disabled and "--no-ytdl" or nil), - -- Pass HTTP headers from current instance - header_fields_arg, - -- Pass User-Agent and Referer - should do no harm even with ytdl active - "--user-agent=" .. mp.get_property_native("user-agent"), - "--referrer=" .. mp.get_property_native("referrer"), - -- User set hardware decoding - "--hwdec=" .. thumbnailer_options.mpv_hwdec, - - -- Insert --no-config, --profile=... and --log-file if enabled - (thumbnailer_options.mpv_no_config and "--no-config" or nil), - profile_arg, - (thumbnailer_options.mpv_logs and log_arg or nil), - - "--start=" .. tostring(timestamp), - "--frames=1", - "--hr-seek=" .. thumbnailer_options.mpv_hr_seek, - "--no-audio", - -- Optionally disable subtitles - (thumbnailer_options.mpv_no_sub and "--no-sub" or nil), - - (options.relative_scale - and ("--vf=scale=iw*%d:ih*%d"):format(size.w, size.h) - or ("--vf=scale=%d:%d"):format(size.w, size.h)), - - "--vf-add=format=bgra", - "--of=rawvideo", - "--ovc=rawvideo", - ("--o=%s"):format(output_path), - - "--", - - file_path, - } - return mp.command_native{name="subprocess", args=mpv_command} -end - - -function create_thumbnail_ffmpeg(file_path, timestamp, size, output_path, options) - options = options or {} - - local ffmpeg_path = ON_MAC and "/opt/homebrew/bin/ffmpeg" or "ffmpeg" - - local ffmpeg_command = { - ffmpeg_path, - "-loglevel", "quiet", - "-noaccurate_seek", - "-ss", format_time(timestamp, ":"), - "-i", file_path, - - "-frames:v", "1", - "-an", - - "-vf", - (options.relative_scale - and ("scale=iw*%d:ih*%d"):format(size.w, size.h) - or ("scale=%d:%d"):format(size.w, size.h)), - - "-c:v", "rawvideo", - "-pix_fmt", "bgra", - "-f", "rawvideo", - - "-y", output_path, - } - return mp.command_native{name="subprocess", args=ffmpeg_command} -end - - -function check_output(ret, output_path, is_mpv) - local log_path = output_path .. ".log" - local success = true - - if ret.killed_by_us then - return nil - else - if ret.error or ret.status ~= 0 then - msg.error("Thumbnailing command failed!") - msg.error("mpv process error:", ret.error) - msg.error("Process stdout:", ret.stdout) - if is_mpv then - msg.error("Debug log:", log_path) - end - - success = false - end - - if not file_exists(output_path) then - msg.error("Output file missing!", output_path) - success = false - end - end - - if is_mpv and not thumbnailer_options.mpv_keep_logs then - -- Remove successful debug logs - if success and file_exists(log_path) then - os.remove(log_path) - end - end - - return success -end - --- split cols x N atlas in BGRA format into many thumbnail files -function split_atlas(atlas_path, cols, thumbnail_size, output_name) - local atlas = io.open(atlas_path, "rb") - local atlas_filesize = atlas:seek("end") - local atlas_pictures = math.floor(atlas_filesize / (4 * thumbnail_size.w * thumbnail_size.h)) - local stride = 4 * thumbnail_size.w * math.min(cols, atlas_pictures) - for pic = 0, atlas_pictures-1 do - local x_start = (pic % cols) * thumbnail_size.w - local y_start = math.floor(pic / cols) * thumbnail_size.h - local filename = output_name(pic) - if filename then - local thumb_file = io.open(filename, "wb") - for line = 0, thumbnail_size.h - 1 do - atlas:seek("set", 4 * x_start + (y_start + line) * stride) - local data = atlas:read(thumbnail_size.w * 4) - if data then - thumb_file:write(data) - end - end - thumb_file:close() - end - end - atlas:close() -end - -function do_worker_job(state_json_string, frames_json_string) - msg.debug("Handling given job") - local thumb_state, err = utils.parse_json(state_json_string) - if err then - msg.error("Failed to parse state JSON") - return - end - - local thumbnail_indexes, err = utils.parse_json(frames_json_string) - if err then - msg.error("Failed to parse thumbnail frame indexes") - return - end - - local thumbnail_func = create_thumbnail_mpv - if not thumbnailer_options.prefer_mpv then - if ExecutableFinder:get_executable_path("ffmpeg") then - thumbnail_func = create_thumbnail_ffmpeg - else - msg.warn("Could not find ffmpeg in PATH! Falling back on mpv.") - end - end - - local file_duration = mp.get_property_native("duration") - local file_path = thumb_state.worker_input_path - - if thumb_state.is_remote and not thumb_state.storyboard then - if (thumbnail_func == create_thumbnail_ffmpeg) then - msg.warn("Thumbnailing remote path, falling back on mpv.") - end - thumbnail_func = create_thumbnail_mpv - end - - local generate_thumbnail_for_index = function(thumbnail_index) - -- Given a 1-based thumbnail index, generate a thumbnail for it based on the thumbnailer state - local thumb_idx = thumbnail_index - 1 - msg.debug("Starting work on thumbnail", thumb_idx) - - local thumbnail_path = thumb_state.thumbnail_template:format(thumb_idx) - -- Grab the "middle" of the thumbnail duration instead of the very start, and leave some margin in the end - local timestamp = math.min(file_duration - 0.25, (thumb_idx + 0.5) * thumb_state.thumbnail_delta) - - mp.commandv("script-message", "mpv_thumbnail_script-progress", tostring(thumbnail_index)) - - -- The expected size (raw BGRA image) - local thumbnail_raw_size = (thumb_state.thumbnail_size.w * thumb_state.thumbnail_size.h * 4) - - local need_thumbnail_generation = false - - -- Check if the thumbnail already exists and is the correct size - local thumbnail_file = io.open(thumbnail_path, "rb") - if not thumbnail_file then - need_thumbnail_generation = true - else - local existing_thumbnail_filesize = thumbnail_file:seek("end") - if existing_thumbnail_filesize ~= thumbnail_raw_size then - -- Size doesn't match, so (re)generate - msg.warn("Thumbnail", thumb_idx, "did not match expected size, regenerating") - need_thumbnail_generation = true - end - thumbnail_file:close() - end - - if need_thumbnail_generation then - local success - if thumb_state.storyboard then - -- get atlas and then split it into thumbnails - local rows = thumb_state.storyboard.rows - local cols = thumb_state.storyboard.cols - local div = thumb_state.storyboard.divisor - local atlas_idx = math.floor(thumb_idx * div /(cols*rows)) - local atlas_path = thumb_state.thumbnail_template:format(atlas_idx) .. ".atlas" - local url = thumb_state.storyboard.fragments[atlas_idx+1].url - if not url then - url = thumb_state.storyboard.fragment_base_url .. "/" .. thumb_state.storyboard.fragments[atlas_idx+1].path - end - local ret = thumbnail_func(url, 0, { w=thumb_state.storyboard.scale, h=thumb_state.storyboard.scale }, atlas_path, { relative_scale=true }) - success = check_output(ret, atlas_path, thumbnail_func == create_thumbnail_mpv) - if success then - split_atlas(atlas_path, cols, thumb_state.thumbnail_size, function(idx) - if (atlas_idx * cols * rows + idx) % div ~= 0 then - return nil - end - return thumb_state.thumbnail_template:format(math.floor((atlas_idx * cols * rows + idx) / div)) - end) - os.remove(atlas_path) - end - else - local ret = thumbnail_func(file_path, timestamp, thumb_state.thumbnail_size, thumbnail_path, thumb_state.worker_extra) - success = check_output(ret, thumbnail_path, thumbnail_func == create_thumbnail_mpv) - end - - if not success then - -- Killed by us, changing files, ignore - msg.debug("Changing files, subprocess killed") - return true - elseif not success then - -- Real failure - mp.osd_message("Thumbnailing failed, check console for details", 3.5) - return true - end - else - msg.debug("Thumbnail", thumb_idx, "already done!") - end - - -- Verify thumbnail size - -- Sometimes ffmpeg will output an empty file when seeking to a "bad" section (usually the end) - thumbnail_file = io.open(thumbnail_path, "rb") - - -- Bail if we can't read the file (it should really exist by now, we checked this in check_output!) - if not thumbnail_file then - msg.error("Thumbnail suddenly disappeared!") - return true - end - - -- Check the size of the generated file - local thumbnail_file_size = thumbnail_file:seek("end") - thumbnail_file:close() - - -- Check if the file is big enough - local missing_bytes = math.max(0, thumbnail_raw_size - thumbnail_file_size) - if missing_bytes > 0 then - msg.warn(("Thumbnail missing %d bytes (expected %d, had %d), padding %s"):format( - missing_bytes, thumbnail_raw_size, thumbnail_file_size, thumbnail_path - )) - -- Pad the file if it's missing content (eg. ffmpeg seek to file end) - thumbnail_file = io.open(thumbnail_path, "ab") - thumbnail_file:write(string.rep(string.char(0), missing_bytes)) - thumbnail_file:close() - end - - msg.debug("Finished work on thumbnail", thumb_idx) - mp.commandv("script-message", "mpv_thumbnail_script-ready", tostring(thumbnail_index), thumbnail_path) - end - - msg.debug(("Generating %d thumbnails @ %dx%d for %q"):format( - #thumbnail_indexes, - thumb_state.thumbnail_size.w, - thumb_state.thumbnail_size.h, - file_path)) - - for i, thumbnail_index in ipairs(thumbnail_indexes) do - local bail = generate_thumbnail_for_index(thumbnail_index) - if bail then return end - end - -end - --- Set up listeners and keybinds - --- Job listener -mp.register_script_message("mpv_thumbnail_script-job", do_worker_job) - - --- Register this worker with the master script -local register_timer = nil -local register_timeout = mp.get_time() + 1.5 - -local register_function = function() - if mp.get_time() > register_timeout and register_timer then - msg.error("Thumbnail worker registering timed out") - register_timer:stop() - else - msg.debug("Announcing self to master...") - mp.commandv("script-message", "mpv_thumbnail_script-worker", mp.get_script_name()) - end -end - -register_timer = mp.add_periodic_timer(0.1, register_function) - -mp.register_script_message("mpv_thumbnail_script-slaved", function() - msg.debug("Successfully registered with master") - register_timer:stop() -end) diff --git a/.config/newsboat/config b/.config/newsboat/config index 1a043b7..c1036c9 100644 --- a/.config/newsboat/config +++ b/.config/newsboat/config @@ -38,7 +38,7 @@ color listfocus_unread red black bold color info yellow black bold color article default default -browser "linkview %u >/dev/null 2>&1 &" +browser "linkview %u" macro , open-in-browser macro t set browser "youtube-dl --add-metadata -ic"; open-in-browser ; set browser linkhandler macro a set browser "youtube-dl --add-metadata -xic -f bestaudio/best"; open-in-browser ; set browser linkhandler diff --git a/.config/zsh/.zshrc b/.config/zsh/.zshrc index 4f09b46..843180b 100644 --- a/.config/zsh/.zshrc +++ b/.config/zsh/.zshrc @@ -119,5 +119,36 @@ bindkey -v "^ " globalias bindkey -v " " magic-space bindkey -M isearch " " magic-space +_gen_fzf_default_opts() { + +local color00='#1d2021' +local color01='#282828' +local color02='#504945' +local color03='#665c54' +local color04='#a89984' +local color05='#bdae93' +local color06='#ebdbb2' +local color07='#fbf1c7' +local color08='#cc241d' +local color09='#fe8019' +local color0A='#d79921' +local color0B='#98971a' +local color0C='#689d6a' +local color0D='#458588' +local color0E='#b16286' +local color0F='#d65d0e' + +export FZF_DEFAULT_OPTS="$FZF_DEFAULT_OPTS"\ +" --color=bg+:$color00,bg:$color00"\ +" --color=fg:$color05,fg+:$color06"\ +" --color=hl:$color08,hl+:$color08"\ +" --color=spinner:$color0D"\ +" --color=header:$color08,info:$color03,pointer:$color08"\ +" --color=marker:$color0C,prompt:$color0A" + +} + +_gen_fzf_default_opts + PROMPT="%B%{$fg[$prompt_main]%}%m %{$fg[$prompt_alt]%}%c%{$fg[$prompt_main]%}%#%{$reset_color%} " RPROMPT="%{$fg_bold[red]%}%(?..%?)%{$reset_color%}" |