Compare commits
3 commits
b6ee44bc5d
...
ddcd283e15
Author | SHA1 | Date | |
---|---|---|---|
ddcd283e15 | |||
ac61910f29 | |||
7ee862d191 |
5 changed files with 300 additions and 15 deletions
|
@ -33,8 +33,8 @@ exec --no-startup-id nm-applet
|
||||||
|
|
||||||
# Use pactl to adjust volume in PulseAudio.
|
# Use pactl to adjust volume in PulseAudio.
|
||||||
set $refresh_i3status killall -SIGUSR1 i3status
|
set $refresh_i3status killall -SIGUSR1 i3status
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
|
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
|
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status
|
||||||
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
||||||
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
||||||
|
|
||||||
|
|
275
.config/mpv/scripts/youtube-quality.lua
Normal file
275
.config/mpv/scripts/youtube-quality.lua
Normal file
|
@ -0,0 +1,275 @@
|
||||||
|
-- youtube-quality.lua
|
||||||
|
--
|
||||||
|
-- Change youtube video quality on the fly.
|
||||||
|
--
|
||||||
|
-- Diplays a menu that lets you switch to different ytdl-format settings while
|
||||||
|
-- you're in the middle of a video (just like you were using the web player).
|
||||||
|
--
|
||||||
|
-- Bound to ctrl-f by default.
|
||||||
|
|
||||||
|
local mp = require 'mp'
|
||||||
|
local utils = require 'mp.utils'
|
||||||
|
local msg = require 'mp.msg'
|
||||||
|
local assdraw = require 'mp.assdraw'
|
||||||
|
|
||||||
|
local opts = {
|
||||||
|
--key bindings
|
||||||
|
toggle_menu_binding = "ctrl+f",
|
||||||
|
up_binding = "UP",
|
||||||
|
down_binding = "DOWN",
|
||||||
|
select_binding = "ENTER",
|
||||||
|
|
||||||
|
--formatting / cursors
|
||||||
|
selected_and_active = "▶ - ",
|
||||||
|
selected_and_inactive = "● - ",
|
||||||
|
unselected_and_active = "▷ - ",
|
||||||
|
unselected_and_inactive = "○ - ",
|
||||||
|
|
||||||
|
--font size scales by window, if false requires larger font and padding sizes
|
||||||
|
scale_playlist_by_window=false,
|
||||||
|
|
||||||
|
--playlist ass style overrides inside curly brackets, \keyvalue is one field, extra \ for escape in lua
|
||||||
|
--example {\\fnUbuntu\\fs10\\b0\\bord1} equals: font=Ubuntu, size=10, bold=no, border=1
|
||||||
|
--read http://docs.aegisub.org/3.2/ASS_Tags/ for reference of tags
|
||||||
|
--undeclared tags will use default osd settings
|
||||||
|
--these styles will be used for the whole playlist. More specific styling will need to be hacked in
|
||||||
|
--
|
||||||
|
--(a monospaced font is recommended but not required)
|
||||||
|
style_ass_tags = "{\\fnmonospace}",
|
||||||
|
|
||||||
|
--paddings for top left corner
|
||||||
|
text_padding_x = 5,
|
||||||
|
text_padding_y = 5,
|
||||||
|
|
||||||
|
--other
|
||||||
|
menu_timeout = 10,
|
||||||
|
|
||||||
|
--use youtube-dl to fetch a list of available formats (overrides quality_strings)
|
||||||
|
fetch_formats = true,
|
||||||
|
|
||||||
|
--default menu entries
|
||||||
|
quality_strings=[[
|
||||||
|
[
|
||||||
|
{"4320p" : "bestvideo[height<=?4320p]+bestaudio/best"},
|
||||||
|
{"2160p" : "bestvideo[height<=?2160]+bestaudio/best"},
|
||||||
|
{"1440p" : "bestvideo[height<=?1440]+bestaudio/best"},
|
||||||
|
{"1080p" : "bestvideo[height<=?1080]+bestaudio/best"},
|
||||||
|
{"720p" : "bestvideo[height<=?720]+bestaudio/best"},
|
||||||
|
{"480p" : "bestvideo[height<=?480]+bestaudio/best"},
|
||||||
|
{"360p" : "bestvideo[height<=?360]+bestaudio/best"},
|
||||||
|
{"240p" : "bestvideo[height<=?240]+bestaudio/best"},
|
||||||
|
{"144p" : "bestvideo[height<=?144]+bestaudio/best"}
|
||||||
|
]
|
||||||
|
]],
|
||||||
|
}
|
||||||
|
(require 'mp.options').read_options(opts, "youtube-quality")
|
||||||
|
opts.quality_strings = utils.parse_json(opts.quality_strings)
|
||||||
|
|
||||||
|
local destroyer = nil
|
||||||
|
|
||||||
|
|
||||||
|
function show_menu()
|
||||||
|
local selected = 1
|
||||||
|
local active = 0
|
||||||
|
local current_ytdl_format = mp.get_property("ytdl-format")
|
||||||
|
msg.verbose("current ytdl-format: "..current_ytdl_format)
|
||||||
|
local num_options = 0
|
||||||
|
local options = {}
|
||||||
|
|
||||||
|
|
||||||
|
if opts.fetch_formats then
|
||||||
|
options, num_options = download_formats()
|
||||||
|
end
|
||||||
|
|
||||||
|
if next(options) == nil then
|
||||||
|
for i,v in ipairs(opts.quality_strings) do
|
||||||
|
num_options = num_options + 1
|
||||||
|
for k,v2 in pairs(v) do
|
||||||
|
options[i] = {label = k, format=v2}
|
||||||
|
if v2 == current_ytdl_format then
|
||||||
|
active = i
|
||||||
|
selected = active
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
--set the cursor to the currently format
|
||||||
|
for i,v in ipairs(options) do
|
||||||
|
if v.format == current_ytdl_format then
|
||||||
|
active = i
|
||||||
|
selected = active
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
function selected_move(amt)
|
||||||
|
selected = selected + amt
|
||||||
|
if selected < 1 then selected = num_options
|
||||||
|
elseif selected > num_options then selected = 1 end
|
||||||
|
timeout:kill()
|
||||||
|
timeout:resume()
|
||||||
|
draw_menu()
|
||||||
|
end
|
||||||
|
function choose_prefix(i)
|
||||||
|
if i == selected and i == active then return opts.selected_and_active
|
||||||
|
elseif i == selected then return opts.selected_and_inactive end
|
||||||
|
|
||||||
|
if i ~= selected and i == active then return opts.unselected_and_active
|
||||||
|
elseif i ~= selected then return opts.unselected_and_inactive end
|
||||||
|
return "> " --shouldn't get here.
|
||||||
|
end
|
||||||
|
|
||||||
|
function draw_menu()
|
||||||
|
local ass = assdraw.ass_new()
|
||||||
|
|
||||||
|
ass:pos(opts.text_padding_x, opts.text_padding_y)
|
||||||
|
ass:append(opts.style_ass_tags)
|
||||||
|
|
||||||
|
for i,v in ipairs(options) do
|
||||||
|
ass:append(choose_prefix(i)..v.label.."\\N")
|
||||||
|
end
|
||||||
|
|
||||||
|
local w, h = mp.get_osd_size()
|
||||||
|
if opts.scale_playlist_by_window then w,h = 0, 0 end
|
||||||
|
mp.set_osd_ass(w, h, ass.text)
|
||||||
|
end
|
||||||
|
|
||||||
|
function destroy()
|
||||||
|
timeout:kill()
|
||||||
|
mp.set_osd_ass(0,0,"")
|
||||||
|
mp.remove_key_binding("move_up")
|
||||||
|
mp.remove_key_binding("move_down")
|
||||||
|
mp.remove_key_binding("select")
|
||||||
|
mp.remove_key_binding("escape")
|
||||||
|
destroyer = nil
|
||||||
|
end
|
||||||
|
timeout = mp.add_periodic_timer(opts.menu_timeout, destroy)
|
||||||
|
destroyer = destroy
|
||||||
|
|
||||||
|
mp.add_forced_key_binding(opts.up_binding, "move_up", function() selected_move(-1) end, {repeatable=true})
|
||||||
|
mp.add_forced_key_binding(opts.down_binding, "move_down", function() selected_move(1) end, {repeatable=true})
|
||||||
|
mp.add_forced_key_binding(opts.select_binding, "select", function()
|
||||||
|
destroy()
|
||||||
|
mp.set_property("ytdl-format", options[selected].format)
|
||||||
|
reload_resume()
|
||||||
|
end)
|
||||||
|
mp.add_forced_key_binding(opts.toggle_menu_binding, "escape", destroy)
|
||||||
|
|
||||||
|
draw_menu()
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
local ytdl = {
|
||||||
|
path = "youtube-dl",
|
||||||
|
searched = false,
|
||||||
|
blacklisted = {}
|
||||||
|
}
|
||||||
|
|
||||||
|
format_cache={}
|
||||||
|
function download_formats()
|
||||||
|
local function exec(args)
|
||||||
|
local ret = utils.subprocess({args = args})
|
||||||
|
return ret.status, ret.stdout, ret
|
||||||
|
end
|
||||||
|
|
||||||
|
local function table_size(t)
|
||||||
|
s = 0
|
||||||
|
for i,v in ipairs(t) do
|
||||||
|
s = s+1
|
||||||
|
end
|
||||||
|
return s
|
||||||
|
end
|
||||||
|
|
||||||
|
local url = mp.get_property("path")
|
||||||
|
|
||||||
|
url = string.gsub(url, "ytdl://", "") -- Strip possible ytdl:// prefix.
|
||||||
|
|
||||||
|
-- don't fetch the format list if we already have it
|
||||||
|
if format_cache[url] ~= nil then
|
||||||
|
local res = format_cache[url]
|
||||||
|
return res, table_size(res)
|
||||||
|
end
|
||||||
|
mp.osd_message("fetching available formats with youtube-dl...", 60)
|
||||||
|
|
||||||
|
if not (ytdl.searched) then
|
||||||
|
local ytdl_mcd = mp.find_config_file("youtube-dl")
|
||||||
|
if not (ytdl_mcd == nil) then
|
||||||
|
msg.verbose("found youtube-dl at: " .. ytdl_mcd)
|
||||||
|
ytdl.path = ytdl_mcd
|
||||||
|
end
|
||||||
|
ytdl.searched = true
|
||||||
|
end
|
||||||
|
|
||||||
|
local command = {ytdl.path, "--no-warnings", "--no-playlist", "-J"}
|
||||||
|
table.insert(command, url)
|
||||||
|
local es, json, result = exec(command)
|
||||||
|
|
||||||
|
if (es < 0) or (json == nil) or (json == "") then
|
||||||
|
mp.osd_message("fetching formats failed...", 1)
|
||||||
|
msg.error("failed to get format list: " .. err)
|
||||||
|
return {}, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
local json, err = utils.parse_json(json)
|
||||||
|
|
||||||
|
if (json == nil) then
|
||||||
|
mp.osd_message("fetching formats failed...", 1)
|
||||||
|
msg.error("failed to parse JSON data: " .. err)
|
||||||
|
return {}, 0
|
||||||
|
end
|
||||||
|
|
||||||
|
res = {}
|
||||||
|
msg.verbose("youtube-dl succeeded!")
|
||||||
|
for i,v in ipairs(json.formats) do
|
||||||
|
if v.vcodec ~= "none" then
|
||||||
|
local fps = v.fps and v.fps.."fps" or ""
|
||||||
|
local resolution = string.format("%sx%s", v.width, v.height)
|
||||||
|
local l = string.format("%-9s %-5s (%-4s / %s)", resolution, fps, v.ext, v.vcodec)
|
||||||
|
local f = string.format("%s+bestaudio/best", v.format_id)
|
||||||
|
table.insert(res, {label=l, format=f, width=v.width })
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
table.sort(res, function(a, b) return a.width > b.width end)
|
||||||
|
|
||||||
|
mp.osd_message("", 0)
|
||||||
|
format_cache[url] = res
|
||||||
|
return res, table_size(res)
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
-- register script message to show menu
|
||||||
|
mp.register_script_message("toggle-quality-menu",
|
||||||
|
function()
|
||||||
|
if destroyer ~= nil then
|
||||||
|
destroyer()
|
||||||
|
else
|
||||||
|
show_menu()
|
||||||
|
end
|
||||||
|
end)
|
||||||
|
|
||||||
|
-- keybind to launch menu
|
||||||
|
mp.add_key_binding(opts.toggle_menu_binding, "quality-menu", show_menu)
|
||||||
|
|
||||||
|
-- special thanks to reload.lua (https://github.com/4e6/mpv-reload/)
|
||||||
|
function reload_resume()
|
||||||
|
local playlist_pos = mp.get_property_number("playlist-pos")
|
||||||
|
local reload_duration = mp.get_property_native("duration")
|
||||||
|
local time_pos = mp.get_property("time-pos")
|
||||||
|
|
||||||
|
mp.set_property_number("playlist-pos", playlist_pos)
|
||||||
|
|
||||||
|
-- Tries to determine live stream vs. pre-recordered VOD. VOD has non-zero
|
||||||
|
-- duration property. When reloading VOD, to keep the current time position
|
||||||
|
-- we should provide offset from the start. Stream doesn't have fixed start.
|
||||||
|
-- Decent choice would be to reload stream from it's current 'live' positon.
|
||||||
|
-- That's the reason we don't pass the offset when reloading streams.
|
||||||
|
if reload_duration and reload_duration > 0 then
|
||||||
|
local function seeker()
|
||||||
|
mp.commandv("seek", time_pos, "absolute")
|
||||||
|
mp.unregister_event(seeker)
|
||||||
|
end
|
||||||
|
mp.register_event("file-loaded", seeker)
|
||||||
|
end
|
||||||
|
end
|
|
@ -9,6 +9,8 @@
|
||||||
#
|
#
|
||||||
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
|
# Please see https://i3wm.org/docs/userguide.html for a complete reference!
|
||||||
|
|
||||||
|
include /etc/sway/config.d/*
|
||||||
|
|
||||||
set $mod Mod4
|
set $mod Mod4
|
||||||
|
|
||||||
# Font for window titles. Will also be used by the bar unless a different font
|
# Font for window titles. Will also be used by the bar unless a different font
|
||||||
|
@ -33,8 +35,8 @@ exec --no-startup-id nm-applet
|
||||||
|
|
||||||
# Use pactl to adjust volume in PulseAudio.
|
# Use pactl to adjust volume in PulseAudio.
|
||||||
set $refresh_i3status killall -SIGUSR1 i3status
|
set $refresh_i3status killall -SIGUSR1 i3status
|
||||||
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status
|
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +5% && $refresh_i3status
|
||||||
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status
|
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -5% && $refresh_i3status
|
||||||
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status
|
||||||
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status
|
||||||
|
|
||||||
|
@ -51,7 +53,7 @@ bindsym $mod+Shift+q kill
|
||||||
#bindsym $mod+d exec dmenu_run
|
#bindsym $mod+d exec dmenu_run
|
||||||
#bindsym $mod+d exec jgmenu_run
|
#bindsym $mod+d exec jgmenu_run
|
||||||
#bindsym $mod+d exec source ~/.bashrc && j4-dmenu-desktop --dmenu="dmenu -i -nb '#2c2e33' -nf '#cccccc' -sf '#ffffff' -sb '#4285f4'" --term="i3-sensible-terminal"
|
#bindsym $mod+d exec source ~/.bashrc && j4-dmenu-desktop --dmenu="dmenu -i -nb '#2c2e33' -nf '#cccccc' -sf '#ffffff' -sb '#4285f4'" --term="i3-sensible-terminal"
|
||||||
bindsym $mod+d exec source ~/.bashrc && wofi --show drun --allow-images -G
|
bindsym $mod+d exec source ~/.bashrc && wofi --show drun --allow-images -G -i
|
||||||
|
|
||||||
# There also is the (new) i3-dmenu-desktop which only displays applications
|
# There also is the (new) i3-dmenu-desktop which only displays applications
|
||||||
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
|
# shipping a .desktop file. It is a wrapper around dmenu, so you need that
|
||||||
|
@ -209,9 +211,11 @@ bindsym XF86AudioNext exec --no-startup-id playerctl next
|
||||||
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
|
bindsym XF86AudioPrev exec --no-startup-id playerctl previous
|
||||||
|
|
||||||
#Screenshot
|
#Screenshot
|
||||||
bindsym Print exec --no-startup-id flameshot gui -p ~/Pictures/Screenshots
|
#bindsym Print exec --no-startup-id flameshot gui -p ~/Pictures/Screenshots
|
||||||
bindsym Shift+Print exec --no-startup-id flameshot full -p ~/Pictures/Screenshots
|
#bindsym Shift+Print exec --no-startup-id flameshot full -p ~/Pictures/Screenshots
|
||||||
bindsym Ctrl+Shift+Print exec --no-startup-id flameshot full -c
|
#bindsym Ctrl+Shift+Print exec --no-startup-id flameshot full -c
|
||||||
|
|
||||||
|
bindsym Print exec --no-startup-id grim -g "$(slurp)" - | swappy -f -
|
||||||
|
|
||||||
# Start i3bar to display a workspace bar (plus the system information i3status
|
# Start i3bar to display a workspace bar (plus the system information i3status
|
||||||
# finds out, if available)
|
# finds out, if available)
|
||||||
|
@ -231,7 +235,7 @@ exec --no-startup-id kanshi &
|
||||||
exec --no-startup-id lxqt-policykit-agent 2>&1 &
|
exec --no-startup-id lxqt-policykit-agent 2>&1 &
|
||||||
exec --no-startup-id syncthing -no-browser -home="$HOME/.config/syncthing" 2>&1 &
|
exec --no-startup-id syncthing -no-browser -home="$HOME/.config/syncthing" 2>&1 &
|
||||||
exec --no-startup-id kdeconnect-indicator 2>&1 &
|
exec --no-startup-id kdeconnect-indicator 2>&1 &
|
||||||
exec --no-startup-id xfce4-power-manager 2>&1 &
|
#exec --no-startup-id xfce4-power-manager 2>&1 &
|
||||||
exec --no-startup-id xss-lock -- betterlockscreen -l -t "${USER}@${HOSTNAME}" --off 10 2>&1 &
|
exec --no-startup-id xss-lock -- betterlockscreen -l -t "${USER}@${HOSTNAME}" --off 10 2>&1 &
|
||||||
exec --no-startup-id ~/.config/i3/customonce.sh 2>&1
|
exec --no-startup-id ~/.config/i3/customonce.sh 2>&1
|
||||||
|
|
||||||
|
@ -246,6 +250,9 @@ gaps inner 5
|
||||||
gaps top 0
|
gaps top 0
|
||||||
gaps bottom 0
|
gaps bottom 0
|
||||||
|
|
||||||
|
#before-sleep 'playerctl pause -a'
|
||||||
|
#before-sleep 'swaylock'
|
||||||
|
|
||||||
# Colors
|
# Colors
|
||||||
|
|
||||||
# class border bground text indicator child_border
|
# class border bground text indicator child_border
|
||||||
|
|
|
@ -19,7 +19,8 @@
|
||||||
"tooltip": false
|
"tooltip": false
|
||||||
},
|
},
|
||||||
"clock": {
|
"clock": {
|
||||||
"format": "{:%a %d %b %H:%M}",
|
"format": "{:%a %d %b %H:%M:%S}",
|
||||||
|
"interval": 1,
|
||||||
"tooltip": false
|
"tooltip": false
|
||||||
},
|
},
|
||||||
"battery": {
|
"battery": {
|
||||||
|
@ -47,8 +48,8 @@
|
||||||
"tooltip": false
|
"tooltip": false
|
||||||
},
|
},
|
||||||
"pulseaudio": {
|
"pulseaudio": {
|
||||||
"format": "{icon}",
|
"format": "{volume} {icon}",
|
||||||
"format-alt": "{volume} {icon}",
|
"format-alt": "{icon}",
|
||||||
"format-alt-click": "click-right",
|
"format-alt-click": "click-right",
|
||||||
"format-muted": "",
|
"format-muted": "",
|
||||||
"format-icons": {
|
"format-icons": {
|
||||||
|
@ -94,8 +95,10 @@
|
||||||
"idle_inhibitor": {
|
"idle_inhibitor": {
|
||||||
"format": "{icon}",
|
"format": "{icon}",
|
||||||
"format-icons": {
|
"format-icons": {
|
||||||
"activated": "",
|
//"activated": "鬒",
|
||||||
"deactivated": ""
|
"activated": "",
|
||||||
|
//"deactivated": ""
|
||||||
|
"deactivated": ""
|
||||||
},
|
},
|
||||||
"tooltip": false
|
"tooltip": false
|
||||||
},
|
},
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
window {
|
window {
|
||||||
color: rgba(217, 216, 216, 1);
|
color: rgba(217, 216, 216, 1);
|
||||||
background: rgba(35, 31, 32, 0.00);
|
background: rgba(35, 31, 32, 0.85);
|
||||||
}
|
}
|
||||||
|
|
||||||
window#waybar.solo {
|
window#waybar.solo {
|
||||||
|
|
Loading…
Reference in a new issue