mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-02-04 06:36:35 -08:00
update
This commit is contained in:
@@ -1,6 +1,8 @@
|
|||||||
-- mpv_websocket
|
-- mpv_websocket
|
||||||
-- https://github.com/kuroahna/mpv_websocket
|
-- https://github.com/kuroahna/mpv_websocket
|
||||||
|
|
||||||
|
local use_secondary_subs = false
|
||||||
|
|
||||||
local utils = require("mp.utils")
|
local utils = require("mp.utils")
|
||||||
|
|
||||||
local platform = mp.get_property_native("platform")
|
local platform = mp.get_property_native("platform")
|
||||||
@@ -22,12 +24,18 @@ if err then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function find_mpv_socket(config_file_path)
|
local function find_mpv_socket(config_file_path)
|
||||||
|
-- First, try to get from mpv properties (includes command-line options)
|
||||||
|
local mpv_socket = mp.get_property("input-ipc-server")
|
||||||
|
if mpv_socket and mpv_socket ~= "" then
|
||||||
|
return mpv_socket
|
||||||
|
end
|
||||||
|
|
||||||
|
-- Fall back to reading config file
|
||||||
local file = io.open(config_file_path, "r")
|
local file = io.open(config_file_path, "r")
|
||||||
if file == nil then
|
if file == nil then
|
||||||
error("failed to read mpv config file `" .. config_file_path .. "`")
|
error("failed to read mpv config file `" .. config_file_path .. "`")
|
||||||
end
|
end
|
||||||
|
|
||||||
local mpv_socket
|
|
||||||
for line in file:lines() do
|
for line in file:lines() do
|
||||||
mpv_socket = line:match("^input%-ipc%-server%s*=%s*(%g+)%s*")
|
mpv_socket = line:match("^input%-ipc%-server%s*=%s*(%g+)%s*")
|
||||||
if mpv_socket then
|
if mpv_socket then
|
||||||
@@ -50,18 +58,24 @@ if platform == "windows" then
|
|||||||
end
|
end
|
||||||
|
|
||||||
local function start_websocket()
|
local function start_websocket()
|
||||||
initialised_websocket = mp.command_native_async({
|
local args = {
|
||||||
name = "subprocess",
|
|
||||||
playback_only = false,
|
|
||||||
capture_stdout = true,
|
|
||||||
capture_stderr = true,
|
|
||||||
args = {
|
|
||||||
mpv_websocket_path,
|
mpv_websocket_path,
|
||||||
"-m",
|
"-m",
|
||||||
mpv_socket,
|
mpv_socket,
|
||||||
"-w",
|
"-w",
|
||||||
"6677",
|
"6677",
|
||||||
},
|
}
|
||||||
|
|
||||||
|
if use_secondary_subs then
|
||||||
|
table.insert(args, "-s")
|
||||||
|
end
|
||||||
|
|
||||||
|
initialised_websocket = mp.command_native_async({
|
||||||
|
name = "subprocess",
|
||||||
|
playback_only = false,
|
||||||
|
capture_stdout = true,
|
||||||
|
capture_stderr = true,
|
||||||
|
args = args,
|
||||||
})
|
})
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -79,5 +93,18 @@ local function toggle_websocket()
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
local function toggle_subs_type()
|
||||||
|
if use_secondary_subs then
|
||||||
|
use_secondary_subs = false
|
||||||
|
else
|
||||||
|
use_secondary_subs = true
|
||||||
|
end
|
||||||
|
if initialised_websocket then
|
||||||
|
end_websocket()
|
||||||
|
start_websocket()
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
mp.register_script_message("togglewebsocket", toggle_websocket)
|
mp.register_script_message("togglewebsocket", toggle_websocket)
|
||||||
|
mp.register_script_message("togglesubstype", toggle_subs_type)
|
||||||
start_websocket()
|
start_websocket()
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/env bash
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
THEME="${THEME:-$HOME/.config/rofi/launchers/type-2/style-2.rasi}"
|
THEME="${THEME:-/opt/mpv-yomitan/catppuccin-macchiato.rasi}"
|
||||||
THUMBNAIL_PATH="/tmp/rmpv-thumbnail.jpg"
|
|
||||||
FONTCONFIG_FILE=$HOME/.config/mpv/mpv-fonts.conf
|
FONTCONFIG_FILE=$HOME/.config/mpv/mpv-fonts.conf
|
||||||
COMMAND=mpv
|
COMMAND=mpv
|
||||||
|
VIDEO_EXTENSIONS="mkv|mp4|avi|webm|mov|flv|wmv|m4v|ts|m2ts"
|
||||||
|
|
||||||
# Parse command-line options first
|
# Parse command-line options first
|
||||||
while getopts ":it:" opt; do
|
while getopts ":it:" opt; do
|
||||||
@@ -26,81 +26,56 @@ while getopts ":it:" opt; do
|
|||||||
done
|
done
|
||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
generate_thumbnail() {
|
find_videos() {
|
||||||
local video_file="$1"
|
find "$PWD" -maxdepth 1 -type f -regextype posix-extended \
|
||||||
local temp_thumb="/tmp/rmpv-thumbnail-$$.jpg"
|
-iregex ".*\.($VIDEO_EXTENSIONS)$" 2>/dev/null | sort -V
|
||||||
local thumbnail_file="${video_file%.*}.jpg"
|
}
|
||||||
|
|
||||||
# Clean up previous thumbnail
|
build_rofi_menu() {
|
||||||
rm -f "$THUMBNAIL_PATH"
|
while IFS= read -r video; do
|
||||||
|
[ -z "$video" ] && continue
|
||||||
|
local display_name
|
||||||
|
display_name=$(basename "$video")
|
||||||
|
printf '%s\0icon\x1fthumbnail://%s\n' "$display_name" "$video"
|
||||||
|
done < <(find_videos)
|
||||||
|
}
|
||||||
|
|
||||||
# Validate input
|
get_video_thumbnail() {
|
||||||
if [[ -z "$video_file" ]]; then
|
local video="$1"
|
||||||
echo "Error: No video file specified" >&2
|
local thumb_dir="$HOME/.cache/thumbnails/large"
|
||||||
return 1
|
local video_uri="file://$(realpath "$video")"
|
||||||
|
local thumb_hash=$(echo -n "$video_uri" | md5sum | cut -d' ' -f1)
|
||||||
|
local thumb_path="$thumb_dir/$thumb_hash.png"
|
||||||
|
|
||||||
|
if [[ -f "$thumb_path" ]]; then
|
||||||
|
echo "$thumb_path"
|
||||||
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if [[ ! -f "$video_file" ]]; then
|
local tmp_thumb="/tmp/rmpv-thumb-$$.jpg"
|
||||||
echo "Error: Video file '$video_file' not found" >&2
|
if command -v ffmpegthumbnailer &>/dev/null; then
|
||||||
return 1
|
ffmpegthumbnailer -i "$video" -o "$tmp_thumb" -s 512 -q 5 2>/dev/null && echo "$tmp_thumb"
|
||||||
fi
|
elif command -v ffmpeg &>/dev/null; then
|
||||||
|
ffmpeg -i "$video" -ss 00:00:30 -vframes 1 -vf "scale=512:-1" "$tmp_thumb" 2>/dev/null && echo "$tmp_thumb"
|
||||||
# Check if it's a video file
|
|
||||||
if ! file "$video_file" | grep -qE "(video|Video)"; then
|
|
||||||
echo "Error: '$video_file' doesn't appear to be a video file" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate thumbnail if it doesn't exist
|
|
||||||
if [[ ! -f "$thumbnail_file" ]]; then
|
|
||||||
echo "Generating thumbnail for $(basename "$video_file")..."
|
|
||||||
# Try generating thumbnail side-by-side
|
|
||||||
if ! ffmpeg -ss 00:00:01 -i "$video_file" \
|
|
||||||
-vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \
|
|
||||||
-frames:v 1 \
|
|
||||||
-q:v 4 \
|
|
||||||
"$thumbnail_file" \
|
|
||||||
-loglevel error -y 2>/dev/null; then
|
|
||||||
|
|
||||||
# Fallback to temp file if side-by-side fails (e.g. read-only fs)
|
|
||||||
echo "Warning: Failed to write to $thumbnail_file, trying temp location" >&2
|
|
||||||
thumbnail_file="$temp_thumb"
|
|
||||||
|
|
||||||
if ! ffmpeg -ss 00:00:01 -i "$video_file" \
|
|
||||||
-vf "scale=320:240:force_original_aspect_ratio=decrease,pad=320:240:(ow-iw)/2:(oh-ih)/2" \
|
|
||||||
-frames:v 1 \
|
|
||||||
-q:v 4 \
|
|
||||||
"$thumbnail_file" \
|
|
||||||
-loglevel error -y 2>/dev/null; then
|
|
||||||
echo "Error: Failed to generate thumbnail" >&2
|
|
||||||
return 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Copy to consistent location for notify-send
|
|
||||||
# We use a fixed path so notify-send always finds it
|
|
||||||
if cp "$thumbnail_file" "$THUMBNAIL_PATH" 2>/dev/null; then
|
|
||||||
echo "Thumbnail ready at: $THUMBNAIL_PATH"
|
|
||||||
ls -l "$THUMBNAIL_PATH"
|
|
||||||
file "$THUMBNAIL_PATH"
|
|
||||||
else
|
|
||||||
echo "Error: Failed to copy thumbnail to $THUMBNAIL_PATH" >&2
|
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
choice="$(find . -iname "*[.mkv|.mp4]" | sort -h | rofi -dmenu -i -theme "$THEME" -theme-str 'listview {columns: 1; lines: 15;} window {width: 88%;}' -p "Choose Video")"
|
selection=$(build_rofi_menu | rofi -dmenu -i -show-icons -theme "$THEME" \
|
||||||
if [[ -z "$choice" ]]; then
|
-theme-str 'listview {columns: 1; lines: 15;} window {width: 88%;}' -p "Choose Video ")
|
||||||
|
|
||||||
|
if [[ -z "$selection" ]]; then
|
||||||
echo "No video selected."
|
echo "No video selected."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
generate_thumbnail "$choice"
|
choice="./$selection"
|
||||||
if [[ ! -f "$THUMBNAIL_PATH" ]]; then
|
|
||||||
echo "Warning: Thumbnail not created, notification will have no icon" >&2
|
THUMBNAIL_PATH=$(get_video_thumbnail "$choice")
|
||||||
|
if [[ -n "$THUMBNAIL_PATH" && -f "$THUMBNAIL_PATH" ]]; then
|
||||||
|
notify-send -i "$THUMBNAIL_PATH" "Playing Video" "$(basename "$choice")"
|
||||||
|
else
|
||||||
|
notify-send "Playing Video" "$(basename "$choice")"
|
||||||
fi
|
fi
|
||||||
notify-send -i "$THUMBNAIL_PATH" "Playing Video" "$(basename "$choice")"
|
|
||||||
$COMMAND "$choice" &
|
$COMMAND "$choice" &
|
||||||
|
|
||||||
# vim: ft=sh
|
# vim: ft=sh
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user