mirror of
https://github.com/zhenyan121/dotfiles.git
synced 2026-04-10 14:34:09 +08:00
80 lines
2.1 KiB
Bash
Executable File
80 lines
2.1 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
|
VENV_PYTHON="$SCRIPT_DIR/venv/bin/python"
|
|
PY_STITCH="$SCRIPT_DIR/stitch.py"
|
|
|
|
CONFIG_DIR="$HOME/.cache/longshot-sh"
|
|
CONFIG_FILE="$CONFIG_DIR/mode"
|
|
SAVE_DIR="$HOME/Pictures/Screenshots/longshots"
|
|
mkdir -p "$SAVE_DIR"
|
|
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
TMP_VIDEO="/tmp/longshot_${TIMESTAMP}.mp4"
|
|
OUTPUT_IMG="${SAVE_DIR}/longshot_${TIMESTAMP}.png"
|
|
|
|
# 语言
|
|
if env | grep -q "zh_CN"; then
|
|
TXT_REC="录制中"
|
|
TXT_MSG="正在拼接..."
|
|
TXT_SAVED="已保存并复制"
|
|
WIDTH=6
|
|
else
|
|
TXT_REC="Recording"
|
|
TXT_MSG="Stitching..."
|
|
TXT_SAVED="Saved"
|
|
WIDTH=10
|
|
fi
|
|
|
|
# 录制菜单
|
|
if command -v fuzzel &> /dev/null; then
|
|
MENU_REC_CMD="fuzzel -d --anchor top --y-margin 20 --width $WIDTH --lines 0"
|
|
elif command -v wofi &> /dev/null; then
|
|
MENU_REC_CMD="wofi -d -i -p Rec"
|
|
else
|
|
MENU_REC_CMD="rofi -dmenu -p Rec"
|
|
fi
|
|
|
|
# Step 1: 选区
|
|
GEOMETRY=$(slurp)
|
|
if [ -z "$GEOMETRY" ]; then exit 1; fi
|
|
|
|
# Step 2: 录制
|
|
wf-recorder -g "$GEOMETRY" -f "$TMP_VIDEO" \
|
|
-c libx264 -p crf=0 -p preset=ultrafast -p pixel_format=yuv420p \
|
|
&> /dev/null &
|
|
REC_PID=$!
|
|
|
|
sleep 0.5
|
|
if ! kill -0 $REC_PID 2>/dev/null; then
|
|
notify-send "Error" "wf-recorder failed"
|
|
exit 1
|
|
fi
|
|
|
|
# Step 3: 停止菜单
|
|
echo "Stop" | $MENU_REC_CMD -p "$TXT_REC" > /dev/null
|
|
|
|
kill -SIGINT $REC_PID
|
|
wait $REC_PID 2>/dev/null
|
|
|
|
# Step 4: 处理
|
|
if [ -f "$TMP_VIDEO" ]; then
|
|
notify-send -t 2000 "Longshot" "$TXT_MSG"
|
|
|
|
"$VENV_PYTHON" "$PY_STITCH" "$TMP_VIDEO" "$OUTPUT_IMG"
|
|
rm -f "$TMP_VIDEO"
|
|
|
|
if [ -f "$OUTPUT_IMG" ]; then
|
|
if command -v wl-copy &> /dev/null; then wl-copy < "$OUTPUT_IMG"; fi
|
|
|
|
# 自动执行动作
|
|
FINAL_MODE=$(cat "$CONFIG_FILE" 2>/dev/null || echo "PREVIEW")
|
|
case "$FINAL_MODE" in
|
|
"PREVIEW") imv "$OUTPUT_IMG" ;;
|
|
"EDIT") if command -v satty &> /dev/null; then satty -f "$OUTPUT_IMG"; else imv "$OUTPUT_IMG"; fi ;;
|
|
"SAVE") notify-send "Longshot" "$TXT_SAVED: $(basename "$OUTPUT_IMG")" ;;
|
|
esac
|
|
fi
|
|
else
|
|
notify-send "Error" "No video"
|
|
fi |