mirror of
https://github.com/ksyasuda/dotfiles.git
synced 2026-02-04 06:36:35 -08:00
Compare commits
15 Commits
7d47044e5c
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| 3218ceada1 | |||
| dca8f0df32 | |||
|
da80481d63
|
|||
|
e6c89cf38b
|
|||
|
35357f1674
|
|||
|
bd6eefe084
|
|||
| 4eda790932 | |||
| d57275597d | |||
| 75a9cc360c | |||
| 5b9cbbba99 | |||
|
c867434c8d
|
|||
|
63cd7242b6
|
|||
|
7f28515e8d
|
|||
|
|
88f0d9938c | ||
|
|
7957d0b57c |
@@ -39,6 +39,5 @@
|
|||||||
"excludedCommands": [
|
"excludedCommands": [
|
||||||
"docker"
|
"docker"
|
||||||
]
|
]
|
||||||
},
|
}
|
||||||
"model": "haiku"
|
|
||||||
}
|
}
|
||||||
43
.claude/settings.json##os.Linux
Normal file
43
.claude/settings.json##os.Linux
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"attribution": {
|
||||||
|
"commit": "",
|
||||||
|
"pr": ""
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"deny": [
|
||||||
|
"Read(.env)",
|
||||||
|
"Read(~/.aws/**)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"Notification": [
|
||||||
|
{
|
||||||
|
"matcher": "",
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "notify-send 'Claude Code' 'Claude Code needs your attention'"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enabledPlugins": {
|
||||||
|
"pyright-lsp@claude-plugins-official": true,
|
||||||
|
"typescript-lsp@claude-plugins-official": true,
|
||||||
|
"clangd-lsp@claude-plugins-official": true
|
||||||
|
},
|
||||||
|
"sandbox": {
|
||||||
|
"enabled": false,
|
||||||
|
"autoAllowBashIfSandboxed": true,
|
||||||
|
"network": {
|
||||||
|
"allowUnixSockets": [
|
||||||
|
"/var/run/docker.sock"
|
||||||
|
],
|
||||||
|
"allowLocalBinding": true
|
||||||
|
},
|
||||||
|
"excludedCommands": [
|
||||||
|
"docker"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
44
.claude/settings.json##os.WSL
Normal file
44
.claude/settings.json##os.WSL
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
{
|
||||||
|
"attribution": {
|
||||||
|
"commit": "",
|
||||||
|
"pr": ""
|
||||||
|
},
|
||||||
|
"permissions": {
|
||||||
|
"deny": [
|
||||||
|
"Read(.env)",
|
||||||
|
"Read(~/.aws/**)"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"hooks": {
|
||||||
|
"Notification": [
|
||||||
|
{
|
||||||
|
"matcher": "",
|
||||||
|
"hooks": [
|
||||||
|
{
|
||||||
|
"type": "command",
|
||||||
|
"command": "powershell.exe -Command \"[System.Reflection.Assembly]::LoadWithPartialName('System.Windows.Forms'); [System.Windows.Forms.MessageBox]::Show('Claude Code needs your attention', 'Claude Code')\""
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enabledPlugins": {
|
||||||
|
"pyright-lsp@claude-plugins-official": true,
|
||||||
|
"typescript-lsp@claude-plugins-official": true,
|
||||||
|
"clangd-lsp@claude-plugins-official": true
|
||||||
|
},
|
||||||
|
"sandbox": {
|
||||||
|
"enabled": false,
|
||||||
|
"autoAllowBashIfSandboxed": true,
|
||||||
|
"network": {
|
||||||
|
"allowUnixSockets": [
|
||||||
|
"/var/run/docker.sock"
|
||||||
|
],
|
||||||
|
"allowLocalBinding": true
|
||||||
|
},
|
||||||
|
"excludedCommands": [
|
||||||
|
"docker"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"model": "haiku"
|
||||||
|
}
|
||||||
@@ -17,7 +17,10 @@ app-notifications = no-clipboard-copy
|
|||||||
shell-integration = zsh
|
shell-integration = zsh
|
||||||
shell-integration-features = title,sudo
|
shell-integration-features = title,sudo
|
||||||
desktop-notifications = true
|
desktop-notifications = true
|
||||||
term=ghostty
|
term=xterm-ghostty
|
||||||
|
link-url = true
|
||||||
|
link-previews = true
|
||||||
|
bell-features=system,attention,no-audio
|
||||||
keybind = all:ctrl+enter=unbind
|
keybind = all:ctrl+enter=unbind
|
||||||
keybind = all:ctrl+shift+j=next_tab
|
keybind = all:ctrl+shift+j=next_tab
|
||||||
keybind = all:ctrl+shift+k=last_tab
|
keybind = all:ctrl+shift+k=last_tab
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ bind = $mainMod SHIFT, j, movewindow, d
|
|||||||
bind = $mainMod SHIFT, k, movewindow, u
|
bind = $mainMod SHIFT, k, movewindow, u
|
||||||
bind = $mainMod SHIFT, h, movewindow, l
|
bind = $mainMod SHIFT, h, movewindow, l
|
||||||
bind = $mainMod SHIFT, l, movewindow, r
|
bind = $mainMod SHIFT, l, movewindow, r
|
||||||
bind = CTRL+SHIFT, c, centerwindow
|
bind = $mainMod+SHIFT, c, centerwindow
|
||||||
|
|
||||||
|
|
||||||
# Move focus to next monitor
|
# Move focus to next monitor
|
||||||
|
|||||||
@@ -1,123 +0,0 @@
|
|||||||
{
|
|
||||||
"subtitlePosition": {
|
|
||||||
"yPercent": 15.376111685625649
|
|
||||||
},
|
|
||||||
"keybindings": [
|
|
||||||
{
|
|
||||||
"key": "Space",
|
|
||||||
"command": [
|
|
||||||
"cycle",
|
|
||||||
"pause"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "ArrowRight",
|
|
||||||
"command": [
|
|
||||||
"seek",
|
|
||||||
5
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "ArrowLeft",
|
|
||||||
"command": [
|
|
||||||
"seek",
|
|
||||||
-5
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+Shift+KeyN",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-export-note"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+KeyC",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-copy-primary-sub-to-clipboard"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+Shift+KeyV",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-secondary-sid-toggle"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Shift+KeyL",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-sub-seek-forward"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Shift+KeyH",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-sub-seek-back"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+Shift+KeyH",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-sub-replay"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+Shift+KeyL",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"mpvacious-sub-play-up-to-next"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+KeyV",
|
|
||||||
"command": [
|
|
||||||
"script-binding",
|
|
||||||
"animecards/update-anki-card"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "KeyQ",
|
|
||||||
"command": [
|
|
||||||
"quit"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"key": "Ctrl+KeyW",
|
|
||||||
"command": [
|
|
||||||
"quit"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"texthooker": {
|
|
||||||
"openBrowser": false
|
|
||||||
},
|
|
||||||
"websocket": {
|
|
||||||
"enabled": "auto",
|
|
||||||
"port": 6677
|
|
||||||
},
|
|
||||||
"ankiConnect": {
|
|
||||||
"enabled": true,
|
|
||||||
"url": "http://127.0.0.1:8765",
|
|
||||||
"deck": "Minecraft",
|
|
||||||
"pollingRate": 200,
|
|
||||||
"audioField": "ExpressionAudio",
|
|
||||||
"imageField": "Picture",
|
|
||||||
"sentenceField": "Sentence",
|
|
||||||
"generateAudio": true,
|
|
||||||
"generateImage": true,
|
|
||||||
"imageType": "avif",
|
|
||||||
"imageFormat": "webp",
|
|
||||||
"miscInfoPattern": "[mpv-yomitan] %f (%t)",
|
|
||||||
"overwriteAudio": true,
|
|
||||||
"overwriteImage": true,
|
|
||||||
"highlightWord": true,
|
|
||||||
"showNotificationOnUpdate": true,
|
|
||||||
"audioPadding": 0.5,
|
|
||||||
"fallbackDuration": 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -8,7 +8,7 @@ dither=fruit # Lightweight dithering
|
|||||||
ontop=yes
|
ontop=yes
|
||||||
border=no
|
border=no
|
||||||
no-border
|
no-border
|
||||||
autofit=50% # Reasonable default size
|
autofit=69% # Reasonable default size
|
||||||
|
|
||||||
# Audio (macOS-specific)
|
# Audio (macOS-specific)
|
||||||
volume=75
|
volume=75
|
||||||
@@ -155,7 +155,7 @@ profile-cond=width >= 1920 and filename:match("mkv$|mp4$")
|
|||||||
glsl-shaders=""
|
glsl-shaders=""
|
||||||
scale=ewa_lanczos
|
scale=ewa_lanczos
|
||||||
target-peak=800
|
target-peak=800
|
||||||
hdr-tone-mapping=bt.2390
|
# hdr-tone-mapping=bt.2390
|
||||||
|
|
||||||
# HDR profile
|
# HDR profile
|
||||||
[hdr]
|
[hdr]
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
../../submodules/mpv-anilist-updater/anilistUpdater/anilistUpdater.py
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
../../submodules/mpv-anilist-updater/anilistUpdater/main.lua
|
|
||||||
@@ -1 +1 @@
|
|||||||
../../../projects/lua/mpv-youtube-queue/mpv-youtube-queue.lua
|
../../mpv-modules/mpv-youtube-queue/mpv-youtube-queue.lua
|
||||||
@@ -1,17 +1,17 @@
|
|||||||
-- Bootstrap lazy.nvim
|
-- Bootstrap lazy.nvim
|
||||||
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim"
|
||||||
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
if not (vim.uv or vim.loop).fs_stat(lazypath) then
|
||||||
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
|
local lazyrepo = "https://github.com/folke/lazy.nvim.git"
|
||||||
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
|
local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath })
|
||||||
if vim.v.shell_error ~= 0 then
|
if vim.v.shell_error ~= 0 then
|
||||||
vim.api.nvim_echo({
|
vim.api.nvim_echo({
|
||||||
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
|
{ "Failed to clone lazy.nvim:\n", "ErrorMsg" },
|
||||||
{ out, "WarningMsg" },
|
{ out, "WarningMsg" },
|
||||||
{ "\nPress any key to exit..." },
|
{ "\nPress any key to exit..." },
|
||||||
}, true, {})
|
}, true, {})
|
||||||
vim.fn.getchar()
|
vim.fn.getchar()
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
vim.opt.rtp:prepend(lazypath)
|
vim.opt.rtp:prepend(lazypath)
|
||||||
|
|
||||||
|
|||||||
129
.config/subminer/config.jsonc
Normal file
129
.config/subminer/config.jsonc
Normal file
@@ -0,0 +1,129 @@
|
|||||||
|
{
|
||||||
|
"subtitlePosition": {
|
||||||
|
"yPercent": 17.38459152016546
|
||||||
|
},
|
||||||
|
"keybindings": [
|
||||||
|
{
|
||||||
|
"key": "Space",
|
||||||
|
"command": [
|
||||||
|
"cycle",
|
||||||
|
"pause"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ArrowRight",
|
||||||
|
"command": [
|
||||||
|
"seek",
|
||||||
|
5
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ArrowLeft",
|
||||||
|
"command": [
|
||||||
|
"seek",
|
||||||
|
-5
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ArrowRight",
|
||||||
|
"command": [
|
||||||
|
"seek",
|
||||||
|
5
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ArrowUp",
|
||||||
|
"command": [
|
||||||
|
"seek",
|
||||||
|
60
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "ArrowDown",
|
||||||
|
"command": [
|
||||||
|
"seek",
|
||||||
|
-60
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "KeyQ",
|
||||||
|
"command": [
|
||||||
|
"quit"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"key": "Ctrl+KeyW",
|
||||||
|
"command": [
|
||||||
|
"quit"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"texthooker": {
|
||||||
|
"openBrowser": false
|
||||||
|
},
|
||||||
|
"websocket": {
|
||||||
|
"enabled": "auto",
|
||||||
|
"port": 6677
|
||||||
|
},
|
||||||
|
"ankiConnect": {
|
||||||
|
"enabled": true,
|
||||||
|
"url": "http://127.0.0.1:8765",
|
||||||
|
"deck": "Minecraft",
|
||||||
|
"pollingRate": 200,
|
||||||
|
"audioField": "ExpressionAudio",
|
||||||
|
"imageField": "Picture",
|
||||||
|
"sentenceField": "Sentence",
|
||||||
|
"generateAudio": true,
|
||||||
|
"generateImage": true,
|
||||||
|
"imageType": "avif",
|
||||||
|
"imageFormat": "webp",
|
||||||
|
"miscInfoPattern": "[mpv-yomitan] %f (%t)",
|
||||||
|
"overwriteAudio": false,
|
||||||
|
"overwriteImage": true,
|
||||||
|
"highlightWord": true,
|
||||||
|
"showNotificationOnUpdate": true,
|
||||||
|
"notificationType": "system",
|
||||||
|
"audioPadding": 0.5,
|
||||||
|
"fallbackDuration": 3,
|
||||||
|
"animatedFps": 24,
|
||||||
|
"animatedMaxWidth": 640,
|
||||||
|
"animatedMaxHeight": null,
|
||||||
|
"animatedCrf": 35,
|
||||||
|
"autoUpdateNewCards": false,
|
||||||
|
"sentenceCardModel": "Lapis Morph",
|
||||||
|
"sentenceCardSentenceField": "Sentence",
|
||||||
|
"sentenceCardAudioField": "SentenceAudio",
|
||||||
|
"isLapis": true,
|
||||||
|
"mediaInsertMode": "append",
|
||||||
|
"auto_start_overlay": false,
|
||||||
|
"secondarySub": {
|
||||||
|
"autoLoadSecondarySub": true,
|
||||||
|
"secondarySubLanguages": [
|
||||||
|
"en",
|
||||||
|
"eng"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"subtitleStyle": {
|
||||||
|
"ontFamily": "Noto Sans CJK JP Regular, Noto Sans CJK JP, Arial Unicode MS, Arial, sans-serif",
|
||||||
|
"fontSize": 35,
|
||||||
|
"fontColor": "#cad3f5",
|
||||||
|
"fontWeight": "normal",
|
||||||
|
"fontStyle": "normal",
|
||||||
|
"backgroundColor": "rgb(30, 32, 48, 0.88)",
|
||||||
|
"secondary": {
|
||||||
|
"fontSize": 24,
|
||||||
|
"fontColor": "#cad3f5",
|
||||||
|
"backgroundColor": "transparent"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"shortcuts": {
|
||||||
|
"copySubtitle": "CommandOrControl+C",
|
||||||
|
"copySubtitleMultiple": "CommandOrControl+Shift+C",
|
||||||
|
"updateLastCardFromClipboard": "CommandOrControl+V",
|
||||||
|
"mineSentence": "CommandOrControl+S",
|
||||||
|
"mineSentenceMultiple": "CommandOrControl+Shift+S",
|
||||||
|
"toggleSecondarySub": "CommandOrControl+Shift+V",
|
||||||
|
"multiCopyTimeoutMs": 3000
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -16,6 +16,7 @@ export GTK_THEME=Dracula
|
|||||||
export XDG_CONFIG_HOME=$HOME/.config
|
export XDG_CONFIG_HOME=$HOME/.config
|
||||||
export COMPOSE_BAKE=true
|
export COMPOSE_BAKE=true
|
||||||
export ANKI_WAYLAND=1
|
export ANKI_WAYLAND=1
|
||||||
|
export SUDO_PROMPT=$'\a[sudo] password for %u: '
|
||||||
|
|
||||||
# nvidia
|
# nvidia
|
||||||
export NVD_BACKEND=direct
|
export NVD_BACKEND=direct
|
||||||
|
|||||||
45
.gitconfig
45
.gitconfig
@@ -1,45 +0,0 @@
|
|||||||
[includeIf "gitdir:~/.local/share/yadm/repo.git"]
|
|
||||||
path = .gitconfig.submodules
|
|
||||||
[gpg]
|
|
||||||
format = ssh
|
|
||||||
[user]
|
|
||||||
signingkey = /home/sudacode/.ssh/yuh.pub
|
|
||||||
name = sudacode
|
|
||||||
email = suda@sudacode.com
|
|
||||||
[commit]
|
|
||||||
gpgsign = true
|
|
||||||
[init]
|
|
||||||
defaultBranch = main
|
|
||||||
[push]
|
|
||||||
default = simple
|
|
||||||
autoSetupRemote = true
|
|
||||||
[diff]
|
|
||||||
algorithm = histogram
|
|
||||||
[merge]
|
|
||||||
conflictstyle = zdiff3
|
|
||||||
[pull]
|
|
||||||
rebase = true
|
|
||||||
[rebase]
|
|
||||||
autostash = true
|
|
||||||
autosquash = true
|
|
||||||
[fetch]
|
|
||||||
prune = true
|
|
||||||
[branch]
|
|
||||||
autosetuprebase = always
|
|
||||||
[core]
|
|
||||||
fsmonitor = true
|
|
||||||
untrackedCache = true
|
|
||||||
editor = nvim
|
|
||||||
pager = delta
|
|
||||||
[alias]
|
|
||||||
st = status
|
|
||||||
co = checkout
|
|
||||||
br = branch
|
|
||||||
lg = log --oneline --graph --decorate --all
|
|
||||||
fixup = commit --fixup
|
|
||||||
undo = reset --soft HEAD~1
|
|
||||||
[interactive]
|
|
||||||
diffFilter = delta --color-only
|
|
||||||
[delta]
|
|
||||||
navigate = true # use n and N to move between diff sections
|
|
||||||
dark = true # or light = true, or omit for auto-detection
|
|
||||||
22
.gitconfig##os.Darwin
Normal file
22
.gitconfig##os.Darwin
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
[user]
|
||||||
|
name = sudacode
|
||||||
|
email = suda@sudacode.com
|
||||||
|
[init]
|
||||||
|
defaultBranch = main
|
||||||
|
[push]
|
||||||
|
default = simple
|
||||||
|
autoSetupRemote = true
|
||||||
|
[pull]
|
||||||
|
rebase = true
|
||||||
|
[rebase]
|
||||||
|
autoStash = true
|
||||||
|
[fetch]
|
||||||
|
prune = true
|
||||||
|
[diff]
|
||||||
|
algorithm = histogram
|
||||||
|
[merge]
|
||||||
|
conflictstyle = zdiff3
|
||||||
|
[color]
|
||||||
|
ui = auto
|
||||||
|
[core]
|
||||||
|
pager = less -FRX
|
||||||
@@ -10,9 +10,9 @@ import sys
|
|||||||
|
|
||||||
import requests
|
import requests
|
||||||
|
|
||||||
# Configuration
|
|
||||||
OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "")
|
OPENROUTER_API_KEY = os.environ.get("OPENROUTER_API_KEY", "")
|
||||||
MODEL = os.environ.get("OPENROUTER_MODEL", "google/gemini-2.0-flash-001")
|
# MODEL = os.environ.get("OPENROUTER_MODEL", "google/gemini-2.0-flash-001")
|
||||||
|
MODEL = os.environ.get("OPENROUTER_MODEL", "openai/gpt-oss-120b:free")
|
||||||
API_URL = "https://openrouter.ai/api/v1/chat/completions"
|
API_URL = "https://openrouter.ai/api/v1/chat/completions"
|
||||||
|
|
||||||
# Try to load API key from file if not in environment
|
# Try to load API key from file if not in environment
|
||||||
|
|||||||
@@ -7,74 +7,74 @@ 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
|
||||||
case $opt in
|
case $opt in
|
||||||
i)
|
i)
|
||||||
COMMAND="$COMMAND --profile=immersion"
|
COMMAND="$COMMAND --profile=immersion"
|
||||||
;;
|
;;
|
||||||
t)
|
t)
|
||||||
THEME="$OPTARG"
|
THEME="$OPTARG"
|
||||||
;;
|
;;
|
||||||
\?)
|
\?)
|
||||||
echo "Invalid option: -$OPTARG" >&2
|
echo "Invalid option: -$OPTARG" >&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
:)
|
:)
|
||||||
echo "Option -$OPTARG requires an argument." >&2
|
echo "Option -$OPTARG requires an argument." >&2
|
||||||
exit 1
|
exit 1
|
||||||
;;
|
;;
|
||||||
esac
|
esac
|
||||||
done
|
done
|
||||||
shift $((OPTIND - 1))
|
shift $((OPTIND - 1))
|
||||||
|
|
||||||
find_videos() {
|
find_videos() {
|
||||||
find "$PWD" -maxdepth 1 -type f -regextype posix-extended \
|
find "$PWD" -maxdepth 1 -type f -regextype posix-extended \
|
||||||
-iregex ".*\.($VIDEO_EXTENSIONS)$" 2>/dev/null | sort -V
|
-iregex ".*\.($VIDEO_EXTENSIONS)$" 2> /dev/null | sort -V
|
||||||
}
|
}
|
||||||
|
|
||||||
build_rofi_menu() {
|
build_rofi_menu() {
|
||||||
while IFS= read -r video; do
|
while IFS= read -r video; do
|
||||||
[ -z "$video" ] && continue
|
[ -z "$video" ] && continue
|
||||||
local display_name
|
local display_name
|
||||||
display_name=$(basename "$video")
|
display_name=$(basename "$video")
|
||||||
printf '%s\0icon\x1fthumbnail://%s\n' "$display_name" "$video"
|
printf '%s\0icon\x1fthumbnail://%s\n' "$display_name" "$video"
|
||||||
done < <(find_videos)
|
done < <(find_videos)
|
||||||
}
|
}
|
||||||
|
|
||||||
get_video_thumbnail() {
|
get_video_thumbnail() {
|
||||||
local video="$1"
|
local video="$1"
|
||||||
local thumb_dir="$HOME/.cache/thumbnails/large"
|
local thumb_dir="$HOME/.cache/thumbnails/large"
|
||||||
local video_uri="file://$(realpath "$video")"
|
local video_uri="file://$(realpath "$video")"
|
||||||
local thumb_hash=$(echo -n "$video_uri" | md5sum | cut -d' ' -f1)
|
local thumb_hash=$(echo -n "$video_uri" | md5sum | cut -d' ' -f1)
|
||||||
local thumb_path="$thumb_dir/$thumb_hash.png"
|
local thumb_path="$thumb_dir/$thumb_hash.png"
|
||||||
|
|
||||||
if [[ -f "$thumb_path" ]]; then
|
if [[ -f "$thumb_path" ]]; then
|
||||||
echo "$thumb_path"
|
echo "$thumb_path"
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
local tmp_thumb="/tmp/rmpv-thumb-$$.jpg"
|
local tmp_thumb="/tmp/rmpv-thumb-$$.jpg"
|
||||||
if command -v ffmpegthumbnailer &>/dev/null; then
|
if command -v ffmpegthumbnailer &> /dev/null; then
|
||||||
ffmpegthumbnailer -i "$video" -o "$tmp_thumb" -s 512 -q 5 2>/dev/null && echo "$tmp_thumb"
|
ffmpegthumbnailer -i "$video" -o "$tmp_thumb" -s 512 -q 5 2> /dev/null && echo "$tmp_thumb"
|
||||||
elif command -v ffmpeg &>/dev/null; then
|
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"
|
ffmpeg -i "$video" -ss 00:00:30 -vframes 1 -vf "scale=512:-1" "$tmp_thumb" 2> /dev/null && echo "$tmp_thumb"
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
selection=$(build_rofi_menu | rofi -dmenu -i -show-icons -theme "$THEME" \
|
selection=$(build_rofi_menu | rofi -dmenu -i -show-icons -theme "$THEME" \
|
||||||
-theme-str 'listview {columns: 1; lines: 15;} window {width: 88%;}' -p "Choose Video ")
|
-theme-str 'configuration {font: "JetBrainsMono Nerd Font 10";} listview {columns: 1; lines: 15;} window {width: 88%;}' -p "Choose Video ")
|
||||||
|
|
||||||
if [[ -z "$selection" ]]; then
|
if [[ -z "$selection" ]]; then
|
||||||
echo "No video selected."
|
echo "No video selected."
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
choice="./$selection"
|
choice="./$selection"
|
||||||
|
|
||||||
THUMBNAIL_PATH=$(get_video_thumbnail "$choice")
|
THUMBNAIL_PATH=$(get_video_thumbnail "$choice")
|
||||||
if [[ -n "$THUMBNAIL_PATH" && -f "$THUMBNAIL_PATH" ]]; then
|
if [[ -n "$THUMBNAIL_PATH" && -f "$THUMBNAIL_PATH" ]]; then
|
||||||
notify-send -i "$THUMBNAIL_PATH" "Playing Video" "$(basename "$choice")"
|
notify-send -i "$THUMBNAIL_PATH" "Playing Video" "$(basename "$choice")"
|
||||||
else
|
else
|
||||||
notify-send "Playing Video" "$(basename "$choice")"
|
notify-send "Playing Video" "$(basename "$choice")"
|
||||||
fi
|
fi
|
||||||
$COMMAND "$choice" &
|
$COMMAND "$choice" &
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user