diff options
-rw-r--r-- | awesome/rc.lua | 572 | ||||
-rw-r--r-- | awesome/theme.lua | 115 | ||||
-rwxr-xr-x | firefox/userChrome.css | 312 | ||||
-rwxr-xr-x | firefox/userContent.css | 1 | ||||
-rw-r--r-- | mpv/config | 48 | ||||
-rw-r--r-- | mpv/input.conf | 1 | ||||
-rw-r--r-- | mpv/scripts.other/fpsadjust.lua | 50 | ||||
-rw-r--r-- | mpv/scripts.other/mpv-progressbar.lua | 1052 | ||||
-rw-r--r-- | mpv/scripts/autoload.lua | 121 | ||||
-rw-r--r-- | mpv/scripts/autosub.lua | 24 | ||||
-rw-r--r-- | mpv/scripts/stats.lua | 263 | ||||
-rw-r--r-- | penis | 0 | ||||
-rw-r--r-- | tmux/tmux.conf (renamed from tmux.conf) | 0 | ||||
-rw-r--r-- | weechat/weechat.conf (renamed from weechat.conf) | 0 |
14 files changed, 1853 insertions, 706 deletions
diff --git a/awesome/rc.lua b/awesome/rc.lua deleted file mode 100644 index df7f57a..0000000 --- a/awesome/rc.lua +++ /dev/null @@ -1,572 +0,0 @@ --- Standard awesome library -local gears = require("gears") -local awful = require("awful") -awful.rules = require("awful.rules") -require("awful.autofocus") --- Widget and layout library -local wibox = require("wibox") --- Theme handling library -local beautiful = require("beautiful") --- Notification library -local naughty = require("naughty") -local menubar = require("menubar") -local vicious = require("vicious") --- awful.util.spawn_with_shell("compton -cGf") --- {{{ Error handling --- Check if awesome encountered an error during startup and fell back to --- another config (This code will only ever execute for the fallback config) -if awesome.startup_errors then - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, there were errors during startup!", - text = awesome.startup_errors }) -end - --- Handle runtime errors after startup -do - local in_error = false - awesome.connect_signal("debug::error", function (err) - -- Make sure we don't go into an endless error loop - if in_error then return end - in_error = true - - naughty.notify({ preset = naughty.config.presets.critical, - title = "Oops, an error happened!", - text = err }) - in_error = false - end) -end --- }}} - --- {{{ Variable definitions --- Themes define colours, icons, and wallpapers -beautiful.init("/home/zephcom/.config/awesome/themes/darkappa/theme.lua") --- }}} --- {{{ wallpaper rotate -function scandir(directory, filter) - local i, t, popen = 0, {}, io.popen - if not filter then - filter = function(s) return true end - end - print(filter) - for filename in popen('ls -a "'..directory..'"'):lines() do - if filter(filename) then - i = i + 1 - t[i] = filename - end - end - return t -end --- }}} --- {{{ configure wallpaper rotate -wp_index = 1 -wp_timeout = 60 -wp_path = "/home/zephcom/Pictures/Wallpaper/Awesome/" -wp_filter = function(s) return string.match(s,"%.png$") or string.match(s,"%.jpg$") end -wp_files = scandir(wp_path, wp_filter) --- wallpaper timer -wp_timer = timer { timeout = wp_timeout } -wp_timer:connect_signal("timeout", function() - -- set wallpaper - for s = 1, screen.count() do - gears.wallpaper.maximized(wp_path .. wp_files[wp_index], s, true) - end - -- stop the timer - wp_timer:stop() - -- random index - wp_index = math.random( 1, #wp_files) - -- restart timer - wp_timer.timeout = wp_timeout - wp_timer:start() -end) --- initial start -wp_timer:start() --- This is used later as the default terminal and editor to run. -terminal = "urxvt" -editor = os.getenv("EDITOR") or "nano" -editor_cmd = terminal .. " -e " .. editor - --- Default modkey. --- Usually, Mod4 is the key with a logo between Control and Alt. --- If you do not like this or do not have such a key, --- I suggest you to remap Mod4 to another key using xmodmap or other tools. --- However, you can use another modifier like Mod1, but it may interact with others. -modkey = "Mod4" - --- Table of layouts to cover with awful.layout.inc, order matters. -local layouts = -{ - awful.layout.suit.floating, - awful.layout.suit.tile, - awful.layout.suit.tile.left, - awful.layout.suit.tile.bottom, - awful.layout.suit.tile.top, - awful.layout.suit.fair, - awful.layout.suit.fair.horizontal, - awful.layout.suit.spiral, - awful.layout.suit.spiral.dwindle, - awful.layout.suit.max, - awful.layout.suit.max.fullscreen, - awful.layout.suit.magnifier -} --- }}} - --- {{{ Wallpaper -if beautiful.wallpaper then - for s = 1, screen.count() do - gears.wallpaper.maximized(beautiful.wallpaper, s, true) - end -end --- }}} - --- {{{ Tags --- Define a tag table which hold all screen tags. -tags = {} -for s = 1, screen.count() do - -- Each screen has its own tag table. --- tags[s] = awful.tag({ "1", "2", "3", "4", "5", "6"}, s, layouts[1]) - tags[s] = awful.tag({ "一", "二", "三", "四", "五", "六", "七"}, s, layouts[1]) -end --- }}} - --- {{{ Menu --- Create a laucher widget and a main menu -myawesomemenu = { - { "manual", terminal .. " -e man awesome" }, - { "edit config", editor_cmd .. " " .. awesome.conffile }, - { "restart", awesome.restart }, - { "quit", awesome.quit } -} -mymainmenu = awful.menu({ items = { { "awesome", myawesomemenu, beautiful.awesome_icon }, - { "tools", sysmenu, nil }, - { "games", gamesmenu, nil }, - { "terminal", terminal }, - { "file browser", terminal .. " -e ranger" }, - { "&firefox", "firefox" }, - { "&mail", "thunderbird"}, - { "&gimp", "gimp"}, - { "&ncmpcpp", terminal .. " -e ncmpcpp" } - } - }) - - -mylauncher = awful.widget.launcher({ image = beautiful.awesome_icon, - menu = mymainmenu }) - --- Menubar configuration -menubar.utils.terminal = terminal -- Set the terminal for applications that require it --- }}} -separator = wibox.widget.textbox(" |") --- {{{ Wibox --- Create a textclock widget -mytextclock = awful.widget.textclock() - --- Keyboard widget, changes between ansi and shitty iso swe layout -kbdcfg = {} -kbdcfg.cmd = "setxkbmap" -kbdcfg.layout = { { "us", "" }, { "se", "" } } -kbdcfg.current = 1 -- us is our default layout -kbdcfg.widget = wibox.widget.textbox() -kbdcfg.widget:set_text(" " .. kbdcfg.layout[kbdcfg.current][1] .. "") -kbdcfg.switch = function () - kbdcfg.current = kbdcfg.current % #(kbdcfg.layout) + 1 - local t = kbdcfg.layout[kbdcfg.current] - kbdcfg.widget:set_text(" " .. t[1] .. "") - os.execute( kbdcfg.cmd .. " " .. t[1] .. "" .. t[2] ) - end --- mouse bindings for keyboard widget -kbdcfg.widget:buttons( - awful.util.table.join(awful.button({ }, 1, function () kbdcfg.switch() end)) - ) --- icons and other stuffs -batimage = wibox.widget.imagebox() -batimage:set_image (beautiful.widget_battery) -batwidget = wibox.widget.textbox() --- Register widget -vicious.register(batwidget, vicious.widgets.bat, "$1$2% $3", 3, "BAT0") -clockimage = wibox.widget.imagebox() -clockimage:set_image (beautiful.widget_clock) - -thermalwidget = wibox.widget.textbox() -vicious.register(thermalwidget, vicious.widgets.thermal, "$1°С",4,"thermal_zone0") -thermalimage = wibox.widget.imagebox() -thermalimage:set_image (beautiful.widget_temp) - -volwidget = wibox.widget.textbox() -vicious.register(volwidget, vicious.widgets.volume, " $1%", 1, "Master") -volimage = wibox.widget.imagebox() -volimage:set_image (beautiful.widget_volume) - - -memimage = wibox.widget.imagebox() -memimage:set_image (beautiful.widget_mem) -memwidget = wibox.widget.textbox() -vicious.register(memwidget, vicious.widgets.mem, "$2MB") - - -mpdimage = wibox.widget.imagebox() -mpdimage:set_image (beautiful.widget_music) --- Initialize widget -mpdwidget = wibox.widget.textbox() --- Register widget -vicious.register(mpdwidget, vicious.widgets.mpd, - function (mpdwidget, args) - if args["{state}"] == "Stop" then - return " - " - else - return args["{Artist}"]..' - '.. args["{Title}"] - end - end, 2) - - --- Create a wibox for each screen and add it --- bottombox = {} -mywibox = {} -mypromptbox = {} -mylayoutbox = {} -mytaglist = {} -mytaglist.buttons = awful.util.table.join( - awful.button({ }, 1, awful.tag.viewonly), - awful.button({ modkey }, 1, awful.client.movetotag), - awful.button({ }, 3, awful.tag.viewtoggle), - awful.button({ modkey }, 3, awful.client.toggletag), - awful.button({ }, 4, function(t) awful.tag.viewnext(awful.tag.getscreen(t)) end), - awful.button({ }, 5, function(t) awful.tag.viewprev(awful.tag.getscreen(t)) end) - ) -mytasklist = {} -mytasklist.buttons = awful.util.table.join( - awful.button({ }, 1, function (c) - if c == client.focus then - c.minimized = true - else - -- Without this, the following - -- :isvisible() makes no sense - c.minimized = false - if not c:isvisible() then - awful.tag.viewonly(c:tags()[1]) - end - -- This will also un-minimize - -- the client, if needed - client.focus = c - c:raise() - end - end), - awful.button({ }, 3, function () - if instance then - instance:hide() - instance = nil - else - instance = awful.menu.clients({ width=250 }) - end - end), - awful.button({ }, 4, function () - awful.client.focus.byidx(1) - if client.focus then client.focus:raise() end - end), - awful.button({ }, 5, function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end)) - -for s = 1, screen.count() do - -- Create a promptbox for each screen - mypromptbox[s] = awful.widget.prompt() - -- Create an imagebox widget which will contains an icon indicating which layout we're using. - -- We need one layoutbox per screen. - mylayoutbox[s] = awful.widget.layoutbox(s) - mylayoutbox[s]:buttons(awful.util.table.join( - awful.button({ }, 1, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 3, function () awful.layout.inc(layouts, -1) end), - awful.button({ }, 4, function () awful.layout.inc(layouts, 1) end), - awful.button({ }, 5, function () awful.layout.inc(layouts, -1) end))) - -- Create a taglist widget - mytaglist[s] = awful.widget.taglist(s, awful.widget.taglist.filter.all, mytaglist.buttons) - - -- Create a tasklist widget - mytasklist[s] = awful.widget.tasklist(s, awful.widget.tasklist.filter.currenttags, mytasklist.buttons) - - -- Create the wibox - mywibox[s] = awful.wibox({ position = "top", screen = s }) - -- bottombox[s] = awful.wibox({ position = "bottom", screen = s }) - - -- Widgets that are aligned to the left - local left_layout = wibox.layout.fixed.horizontal() - left_layout:add(mytaglist[s]) - left_layout:add(mypromptbox[s]) - - -- Widgets that are aligned to the right - local right_layout = wibox.layout.fixed.horizontal() - if s == 1 then right_layout:add(wibox.widget.systray()) end - right_layout:add(separator) - right_layout:add(mpdimage) - right_layout:add(mpdwidget) - right_layout:add(separator) - right_layout:add(volimage) - right_layout:add(volwidget) - right_layout:add(separator) - right_layout:add(thermalimage) - right_layout:add(thermalwidget) - right_layout:add(separator) - right_layout:add(memimage) - right_layout:add(memwidget) - right_layout:add(separator) - right_layout:add(batimage) - right_layout:add(batwidget) - right_layout:add(separator) - right_layout:add(clockimage) - right_layout:add(mytextclock) - right_layout:add(separator) - right_layout:add(kbdcfg.widget) - right_layout:add(separator) - right_layout:add(mylayoutbox[s]) - -- Now bring it all together (with the tasklist in the middle) - local layout = wibox.layout.align.horizontal() - layout:set_left(left_layout) - layout:set_middle(mytasklist[s]) - layout:set_right(right_layout) - - mywibox[s]:set_widget(layout) -end --- local right_layout = wibox.layout.fixed.horizontal() --- if s == 1 then right_layout:add(wibox.widget.systray()) end --- right_layout:add(mytextclock) --- local layout = wibox.layout.align.horizontal() --- layout:set_right(right_layout) --- bottombox[s]:set_widget(layout) --- }}} - --- {{{ Mouse bindings -root.buttons(awful.util.table.join( - awful.button({ }, 3, function () mymainmenu:toggle() end))) --- }}} - --- {{{ Key bindings -globalkeys = awful.util.table.join( - awful.key({ modkey, }, "Left", awful.tag.viewprev ), - awful.key({ modkey, }, "Right", awful.tag.viewnext ), - awful.key({ modkey, }, "Escape", awful.tag.history.restore), - awful.key({ }, "Menu", function () kbdcfg.switch() end), - - awful.key({ modkey, }, "j", - function () - awful.client.focus.byidx( 1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "k", - function () - awful.client.focus.byidx(-1) - if client.focus then client.focus:raise() end - end), - awful.key({ modkey, }, "w", function () mymainmenu:show() end), - - -- Layout manipulation - awful.key({ modkey, "Shift" }, "j", function () awful.client.swap.byidx( 1) end), - awful.key({ modkey, "Shift" }, "k", function () awful.client.swap.byidx( -1) end), - awful.key({ modkey, "Control" }, "j", function () awful.screen.focus_relative( 1) end), - awful.key({ modkey, "Control" }, "k", function () awful.screen.focus_relative(-1) end), - awful.key({ modkey, }, "u", awful.client.urgent.jumpto), - awful.key({ modkey, }, "Tab", - function () - awful.client.focus.history.previous() - if client.focus then - client.focus:raise() - end - end), - - -- Standard program - awful.key({ modkey, }, "Return", function () awful.util.spawn(terminal) end), - awful.key({ modkey, "Control" }, "r", awesome.restart), - awful.key({ modkey, "Shift" }, "q", awesome.quit), - - awful.key({ modkey, }, "l", function () awful.tag.incmwfact( 0.05) end), - awful.key({ modkey, }, "h", function () awful.tag.incmwfact(-0.05) end), - awful.key({ modkey, "Shift" }, "h", function () awful.tag.incnmaster( 1) end), - awful.key({ modkey, "Shift" }, "l", function () awful.tag.incnmaster(-1) end), - awful.key({ modkey, "Control" }, "h", function () awful.tag.incncol( 1) end), - awful.key({ modkey, "Control" }, "l", function () awful.tag.incncol(-1) end), - awful.key({ modkey, }, "space", function () awful.layout.inc(layouts, 1) end), - awful.key({ modkey, "Shift" }, "space", function () awful.layout.inc(layouts, -1) end), - - awful.key({ modkey, "Control" }, "n", awful.client.restore), - - -- Prompt - awful.key({ modkey }, "r", function () mypromptbox[mouse.screen]:run() end), - - awful.key({ modkey }, "x", - function () - awful.prompt.run({ prompt = "Run Lua code: " }, - mypromptbox[mouse.screen].widget, - awful.util.eval, nil, - awful.util.getdir("cache") .. "/history_eval") - end), - -- Menubar - awful.key({ modkey }, "p", function() menubar.show() end) -) - -clientkeys = awful.util.table.join( - awful.key({ modkey, }, "f", function (c) c.fullscreen = not c.fullscreen end), - awful.key({ modkey, "Shift" }, "c", function (c) c:kill() end), - awful.key({ modkey, "Control" }, "space", awful.client.floating.toggle ), - awful.key({ modkey, "Control" }, "Return", function (c) c:swap(awful.client.getmaster()) end), - awful.key({ modkey, }, "o", awful.client.movetoscreen ), - awful.key({ modkey, }, "t", function (c) c.ontop = not c.ontop end), - awful.key({ modkey, }, "n", - function (c) - -- The client currently has the input focus, so it cannot be - -- minimized, since minimized clients can't have the focus. - c.minimized = true - end), - awful.key({ modkey, }, "m", - function (c) - c.maximized_horizontal = not c.maximized_horizontal - c.maximized_vertical = not c.maximized_vertical - end) -) - --- Bind all key numbers to tags. --- Be careful: we use keycodes to make it works on any keyboard layout. --- This should map on the top row of your keyboard, usually 1 to 9. -for i = 1, 9 do - globalkeys = awful.util.table.join(globalkeys, - awful.key({ modkey }, "#" .. i + 9, - function () - local screen = mouse.screen - local tag = awful.tag.gettags(screen)[i] - if tag then - awful.tag.viewonly(tag) - end - end), - awful.key({ modkey, "Control" }, "#" .. i + 9, - function () - local screen = mouse.screen - local tag = awful.tag.gettags(screen)[i] - if tag then - awful.tag.viewtoggle(tag) - end - end), - awful.key({ modkey, "Shift" }, "#" .. i + 9, - function () - if client.focus then - local tag = awful.tag.gettags(client.focus.screen)[i] - if tag then - awful.client.movetotag(tag) - end - end - end), - awful.key({ modkey, "Control", "Shift" }, "#" .. i + 9, - function () - if client.focus then - local tag = awful.tag.gettags(client.focus.screen)[i] - if tag then - awful.client.toggletag(tag) - end - end - end)) -end - -clientbuttons = awful.util.table.join( - awful.button({ }, 1, function (c) client.focus = c; c:raise() end), - awful.button({ modkey }, 1, awful.mouse.client.move), - awful.button({ modkey }, 3, awful.mouse.client.resize)) - --- Set keys -root.keys(globalkeys) --- }}} - --- {{{ Rules -awful.rules.rules = { - -- All clients will match this rule. - { rule = { }, - properties = { border_width = beautiful.border_width, - border_color = beautiful.border_normal, - focus = awful.client.focus.filter, - keys = clientkeys, - buttons = clientbuttons, - size_hints_honor = false } }, - { rule = { class = "feh" }, - properties = { floating = true } }, - { rule = { class = "pinentry" }, - properties = { floating = true } }, - { rule = { class = "mpv" }, - properties = { size_hints_honor = true } }, - { rule = { class = "Arandr" }, - properties = { floating = true } }, - { rule = { class = "Gifview" }, - properties = { floating = true } }, - -- Set Firefox to always map on tags number 2 of screen 1. - -- { rule = { class = "Firefox" }, - -- properties = { tag = tags[1][2] } }, -} --- }}} - --- {{{ Signals --- Signal function to execute when a new client appears. -client.connect_signal("manage", function (c, startup) - -- Enable sloppy focus - c:connect_signal("mouse::enter", function(c) - if awful.layout.get(c.screen) ~= awful.layout.suit.magnifier - and awful.client.focus.filter(c) then - client.focus = c - end - end) - - if not startup then - -- Set the windows at the slave, - -- i.e. put it at the end of others instead of setting it master. - -- awful.client.setslave(c) - - -- Put windows in a smart way, only if they does not set an initial position. - if not c.size_hints.user_position and not c.size_hints.program_position then - awful.placement.no_overlap(c) - awful.placement.no_offscreen(c) - end - end - - local titlebars_enabled = false - if titlebars_enabled and (c.type == "normal" or c.type == "dialog") then - -- buttons for the titlebar - local buttons = awful.util.table.join( - awful.button({ }, 1, function() - client.focus = c - c:raise() - awful.mouse.client.move(c) - end), - awful.button({ }, 3, function() - client.focus = c - c:raise() - awful.mouse.client.resize(c) - end) - ) - - -- Widgets that are aligned to the left - local left_layout = wibox.layout.fixed.horizontal() - left_layout:add(awful.titlebar.widget.iconwidget(c)) - left_layout:buttons(buttons) - - -- Widgets that are aligned to the right - local right_layout = wibox.layout.fixed.horizontal() - right_layout:add(awful.titlebar.widget.floatingbutton(c)) - right_layout:add(awful.titlebar.widget.maximizedbutton(c)) - right_layout:add(awful.titlebar.widget.stickybutton(c)) - right_layout:add(awful.titlebar.widget.ontopbutton(c)) - right_layout:add(awful.titlebar.widget.closebutton(c)) - - -- The title goes in the middle - local middle_layout = wibox.layout.flex.horizontal() - local title = awful.titlebar.widget.titlewidget(c) - title:set_align("center") - middle_layout:add(title) - middle_layout:buttons(buttons) - - -- Now bring it all together - local layout = wibox.layout.align.horizontal() - layout:set_left(left_layout) - layout:set_right(right_layout) - layout:set_middle(middle_layout) - - awful.titlebar(c):set_widget(layout) - end -end) - -client.connect_signal("focus", function(c) c.border_color = beautiful.border_focus end) -client.connect_signal("unfocus", function(c) c.border_color = beautiful.border_normal end) --- }}} diff --git a/awesome/theme.lua b/awesome/theme.lua deleted file mode 100644 index 187cd2c..0000000 --- a/awesome/theme.lua +++ /dev/null @@ -1,115 +0,0 @@ ---------------------------- --- Default awesome theme -- ---------------------------- - -theme = {appasama} - -theme.font = "terminus 8" - -theme.bg_normal = "#252627" - ---theme.bg_focus = "#4b696d" -theme.bg_focus = "#803930" ---theme.bg_focus = "#35374e" -theme.bg_urgent = "#ff0000" -theme.bg_minimize = "#444444" - -theme.fg_normal = "#e1e3e6" -theme.fg_focus = "#ffffff" -theme.fg_urgent = "#d4d4d4" -theme.fg_minimize = "#d4d4d4" - -theme.border_width = "2" - --- theme.border_normal = "#4b696d" --- theme.border_focus = "#4b696d" --- theme.border_marked = "#4b696d" - --- Red theme (argus) -theme.border_normal = "#803930" -theme.border_focus = "#803930" -theme.border_marked = "#803930" - ---theme.border_normal = "#35374e" ---theme.border_focus = "#35374e" ---theme.border_marked = "#35374e" - -theme.tasklist_disable_icon = true --- There are other variable sets --- overriding the default one when --- defined, the sets are: --- [taglist|tasklist]_[bg|fg]_[focus|urgent] --- titlebar_[bg|fg]_[normal|focus] --- tooltip_[font|opacity|fg_color|bg_color|border_width|border_color] --- mouse_finder_[color|timeout|animate_timeout|radius|factor] --- Example: ---theme.taglist_bg_focus = "#ff0000" - --- Display the taglist squares -theme.taglist_squares_sel = "/usr/share/awesome/themes/default/taglist/squarefw.png" -theme.taglist_squares_unsel = "/usr/share/awesome/themes/default/taglist/squarew.png" - -theme.tasklist_floating_icon = "/usr/share/awesome/themes/default/tasklist/floatingw.png" - --- Variables set for theming the menu: --- menu_[bg|fg]_[normal|focus] --- menu_[border_color|border_width] -theme.menu_submenu_icon = "/usr/share/awesome/themes/default/submenu.png" -theme.menu_height = "15" -theme.menu_width = "100" - --- You can add as many variables as --- you wish and access them by using --- beautiful.variable in your rc.lua ---theme.bg_widget = "#cc0000" - --- Define the image to load -theme.titlebar_close_button_normal = "/usr/share/awesome/themes/default/titlebar/close_normal.png" -theme.titlebar_close_button_focus = "/usr/share/awesome/themes/default/titlebar/close_focus.png" - -theme.titlebar_ontop_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_normal_inactive.png" -theme.titlebar_ontop_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/ontop_focus_inactive.png" -theme.titlebar_ontop_button_normal_active = "/usr/share/awesome/themes/default/titlebar/ontop_normal_active.png" -theme.titlebar_ontop_button_focus_active = "/usr/share/awesome/themes/default/titlebar/ontop_focus_active.png" - -theme.titlebar_sticky_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_normal_inactive.png" -theme.titlebar_sticky_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/sticky_focus_inactive.png" -theme.titlebar_sticky_button_normal_active = "/usr/share/awesome/themes/default/titlebar/sticky_normal_active.png" -theme.titlebar_sticky_button_focus_active = "/usr/share/awesome/themes/default/titlebar/sticky_focus_active.png" - -theme.titlebar_floating_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/floating_normal_inactive.png" -theme.titlebar_floating_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/floating_focus_inactive.png" -theme.titlebar_floating_button_normal_active = "/usr/share/awesome/themes/default/titlebar/floating_normal_active.png" -theme.titlebar_floating_button_focus_active = "/usr/share/awesome/themes/default/titlebar/floating_focus_active.png" - -theme.titlebar_maximized_button_normal_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_normal_inactive.png" -theme.titlebar_maximized_button_focus_inactive = "/usr/share/awesome/themes/default/titlebar/maximized_focus_inactive.png" -theme.titlebar_maximized_button_normal_active = "/usr/share/awesome/themes/default/titlebar/maximized_normal_active.png" -theme.titlebar_maximized_button_focus_active = "/usr/share/awesome/themes/default/titlebar/maximized_focus_active.png" - --- You can use your own command to set your wallpaper --- theme.wallpaper = "~/.config/awesome/themes/matoiwall.png" --- You can use your own layout icons like this: -theme.layout_fairh = "/usr/share/awesome/themes/default/layouts/fairhw.png" -theme.layout_fairv = "/usr/share/awesome/themes/default/layouts/fairvw.png" -theme.layout_floating = "/usr/share/awesome/themes/default/layouts/floatingw.png" -theme.layout_magnifier = "/usr/share/awesome/themes/default/layouts/magnifierw.png" -theme.layout_max = "/usr/share/awesome/themes/default/layouts/maxw.png" -theme.layout_fullscreen = "/usr/share/awesome/themes/default/layouts/fullscreenw.png" -theme.layout_tilebottom = "/usr/share/awesome/themes/default/layouts/tilebottomw.png" -theme.layout_tileleft = "/usr/share/awesome/themes/default/layouts/tileleftw.png" -theme.layout_tile = "/usr/share/awesome/themes/default/layouts/tilew.png" -theme.layout_tiletop = "/usr/share/awesome/themes/default/layouts/tiletopw.png" -theme.layout_spiral = "/usr/share/awesome/themes/default/layouts/spiralw.png" -theme.layout_dwindle = "/usr/share/awesome/themes/default/layouts/dwindlew.png" - -theme.awesome_icon = "/usr/share/awesome/icons/awesome16.png" - -theme.widget_mem = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/mem.png" -theme.widget_temp = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/temp.png" -theme.widget_battery = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/battery.png" -theme.widget_music = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/music.png" -theme.widget_clock = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/clock.png" -theme.widget_volume = "/home/zephcom/.config/awesome/themes/darkappa/icons_r/volume.png" -return theme --- vim: filetype=lua:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:textwidth=80 diff --git a/firefox/userChrome.css b/firefox/userChrome.css new file mode 100755 index 0000000..11ad405 --- /dev/null +++ b/firefox/userChrome.css @@ -0,0 +1,312 @@ +@namespace html url(http://www.w3.org/1999/xhtml); +@namespace xul url(http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul); +/* + Author: Twily + Description: Minimal flat styled tabs for Australis + Compitability: Firefox Nightly v31.0a1 - v32.0a1 (Australis) + CSS Variables were introduced to Firefox in v29.0a1 + Website: http://twily.info/ + + + Note: To enable the urlbar; search this css for: + "make the url-bar visible" and "adjust margin-top to" +*/ +#liberator-commandline.status_secure { + background-color: #B0FF00 !important; + color: black; +} +#liberator-commandline-command, +#liberator-statusline, +#liberator-bottombar, +#status-bar, +#liberator-status, +#liberator-message, +#liberator-mode, +#liberator-commandline{ + color: #ededf7; + background: #252627; + font-size: 8pt; + height: 12px; +} +#liberator-container{ + font-size: 8pt; +} +#liberator-commandline * { + color: #ededf7; + background: #252627; + font-size: 8pt; +} +#liberator-commandline-command { + color: #ededf7; + background: #252627; + font-family: Source Code Pro !important; + font-size: 6pt; !important } +#liberator-separator { + border-top: 0px solid transparent !important; } + +:root { + /* TAB VARIABLES */ + --bg-light: #17181A; --bg-dark: #222326; + --fg-light: #D6D7D9; --fg-dark: #AAABAD; + /*--tab-triangle-correction: -1px;*/ + --tab-height: 18px; --tab-icon-size: 16px; --tab-strip-margin: -12px; --tab-overlap: -5px; + --tab-fonts: "Monospace", "Source Sans Pro", "Lemon",monospace,"Dejavu Sans"; --tab-font-size: 8pt; + --tab-triangle: block; /* block | none */ + + /* URL VARIABLES */ + --url-background: var(--bg-light); --url-color: var(--fg-dark); + --url-height: 24px; --url-right-margin: 5px; + --url-fonts: "Terminus", "Source Sans Pro", "Lemon",monospace,"Dejavu Sans"; --url-font-size: 10pt; + --url-text-align: center; /* left | center | right */ + --url-position: absolute; /* absolute == top (under tabs) || fixed == bottom of browser */ + + margin-bottom: 0 /* var(--url-height) */ !important; +} + +@-moz-document url(chrome://browser/content/browser.xul) { + /* URL-BAR */ + #PanelUI-button, #bookmarks-menu-button, #downloads-button, #home-button, #stylish-toolbar-button, #abp-toolbarbutton, + #back-button, #forward-button, #identity-box, #urlbar-reload-button, #urlbar-stop-button, #urlbar-go-button, + #notification-popup-box, #new-tab-button, #private-browsing-indicator, #search-container, #nav-bar-overflow-button, + .tabs-newtab-button, .tab-close-button, .tab-close, .tab-throbber, .tab-background-start, .tab-background-end + /*, #alltabs-button, #tabview-button, .tab-icon-image, .tab-icon-image:not([pinned])*/ { display: none !important; } + + .tab-drop-indicator { margin-bottom: 0 !important; } + + #nav-bar { + position: var(--url-position) !important; bottom: 0 !important; + width: 100% !important; height: var(--url-height) !important; + min-height: var(--url-height) !important; max-height: var(--url-height) !important; + margin: 0 0 0 0 !important; + + /* --- Uncomment the section below to attach the url-bar to the tab-bar [EXPERIMENTAL] (Require a line in "#TabsToolbar" below) --- */ + /* + position: fixed !important; top: 0 !important; left: 0 !important; + width: 315px !important; max-width: 315px !important; + z-index: 100 !important; + /**/ + } + #nav-bar-customization-target { width: 100% !important; } + #urlbar-wrapper { + width: 100% !important; margin-top: -0px !important; /* adjust margin-top to ~ -5px if you experience gap */ + position: absolute !important; top: 0 !important; left: 0 !important; + border-bottom: 0px solid var(--bg-light) !important; + } + #urlbar { + border: none !important; border-radius: 0 !important; + margin: 0 0 0 0 !important; padding: 0 2px 0 9px !important; + width: calc(100% + var(--url-right-margin)) !important; + height: var(--url-height) !important; min-height: var(--url-height) !important; + background: var(--url-background) !important; color: var(--url-color) !important; + font-family: var(--url-fonts) !important; font-size: var(--url-font-size) !important; + text-align: var(--url-text-align) !important; + } + /*#urlbar * { -moz-appearance: none !important; }*/ + + /* --- Comment out the section below to make the url-bar visible --- */ + /**/ + #nav-bar { + width: 0 !important; height: 0 !important; + position: fixed !important; left: -1px !important; top: -1px !important; + overflow: hidden !important; visibility: hidden !important; + } + /**/ + + + /* TABS */ + .tabbrowser-tab[fadein]:not([pinned]) { min-width: 100px !important; max-width: 240px /*100%*/ !important; } + tab { + font-family: var(--tab-fonts) !important; + height: var(--tab-height) !important; min-height: var(--tab-height) !important; + background: var(--bg-dark) !important; color: var(--fg-dark) !important; + font-size: var(--tab-font-size); text-shadow: none !important; text-align: center /* center | left */ !important; + } + + .tabbrowser-tab label { padding: 0 22px 0 22px !important; } + + #tabbrowser-tabs .tabbrowser-tab[pinned] { width: 48px !important; } + #tabbrowser-tabs .tabbrowser-tab[pinned] label { display: none !important; } + + #tabbrowser-tabs .tabbrowser-tab .tab-icon-image { + margin: 0 -10px 0 16px !important; + width: var(--tab-icon-size) !important; + height: var(--tab-icon-size) !important; + } + + .tabbrowser-tab *, .tabs-newtab-button * { + background: none !important; list-style-image: none !important; + margin: 0 0 0 0 !important; padding: 0 0 0 0 !important; + -moz-appearance: none !important; + } + + #tabbrowser-tabs .tabbrowser-tab[pinned] .tab-stack { height: var(--tab-height) !important; width: 100% !important; } + #tabbrowser-tabs .tabbrowser-arrowscrollbox .box-inherit.scrollbox-innerbox { max-height: var(--tab-height) !important; } + .scrollbutton-up, .scrollbutton-down { border: none !important; } + + .tabbrowser-tab[selected="true"] .tab-stack { + background: var(--bg-light) !important; color: var(--fg-light) !important; + border-radius: 0px !important; position: relative !important; + /*border-top: 1px solid #dc52a5 !important;/**/ + } + .tabbrowser-tab[selected="true"]:before { /* Left Triangle (of selected tab) */ + content: '' !important; display: var(--tab-triangle); + position: absolute !important; top: 0 !important; left: var(--tab-overlap) !important; + width: 0 !important; height: 0 !important; + border: none !important; z-index: 2 !important; + + /*border-left: calc(var(--tab-height)/2) solid var(--bg-dark) !important; + border-top: calc((var(--tab-height)/2) - var(--tab-triangle-correction)) solid var(--bg-light) !important; + border-bottom: calc((var(--tab-height)/2) + var(--tab-triangle-correction)) solid var(--bg-light) !important;*/ + border-top: var(--tab-height) solid var(--bg-dark) !important; + border-right: calc(var(--tab-height)/2) solid var(--bg-light) !important; + } + .tabbrowser-tab[selected="true"]:after { /* Right Triangle (of selected tab) */ + content: '' !important; display: var(--tab-triangle); + position: absolute !important; top: 0 !important; right: var(--tab-overlap) !important; + width: 0 !important; height: 0 !important; + border: none !important; z-index: 2 !important; + + /*border-right: calc(var(--tab-height)/2) solid var(--bg-dark) !important; + border-top: calc((var(--tab-height)/2) - var(--tab-triangle-correction)) solid var(--bg-light) !important; + border-bottom: calc((var(--tab-height)/2) + var(--tab-triangle-correction)) solid var(--bg-light) !important;*/ + border-top: var(--tab-height) solid var(--bg-dark) !important; + border-left: calc(var(--tab-height)/2) solid var(--bg-light) !important; + } + + #TabsToolbar, #tabbrowser-tabs { + -moz-appearance: none !important; + height: var(--tab-height) !important; min-height: var(--tab-height)!important; + margin: 0 var(--tab-strip-margin) !important; + background: var(--bg-dark) !important; + + /* --- Uncomment the line below to attach the url-bar to the tab-bar [EXPERIMENTAL] (Require a line in "#nav-bar" above) --- */ + /*margin-left: 150px !important;/**/ + } + #TabsToolbar::after { display: none !important; } + .tabbrowser-tab::before, .tabbrowser-tab::after { background: none !important; } + + /*browser, #navigator-toolbox { -moz-appearance: none !important; background: transparent !important; }*/ + + /*#navigator-toolbox::after { height: 0 !important;/**/ + #navigator-toolbox::after { height: 3px !important; background: var(--bg-light) !important; } + #liberator-separator { height: 3px !important; background: var(--bg-light) !important; } + + /* MENUS */ + menuitem + menuseparator, menu + menuseparator, .menu-iconic-left { display: none !important; } + menuitem > label { margin-left: var(--tab-height) !important; } + menubar, menubutton, menulist, menu, menuitem { + font-family: var(--tab-fonts) !important; font-size: var(--tab-font-size); + height: var(--tab-height) !important; + } + + /* HIDE ORANGE MENU BUTTON */ + #appmenu-toolbar-button, #appmenu-button-container { display: none !important; } + + /* HIDE STATUS BAR */ + #status-bar, #statusbar-display, statuspanel { display: none !important; } + + /* PRIVATE BROWSING ICON HIDE */ + #main-window[privatebrowsingmode=temporary] #private-browsing-indicator, + #main-window[privatebrowsingmode=temporary] #private-browsing-indicator-titlebar { display: none !important; } + + /* Vimperator icon style */ + #liberator-statusline:not([customizing="true"]) { margin: -2px -2px !important; padding: 0 0 !important; height: 24px !important; } + #liberator-statusline:not([customizing="true"]) :-moz-any(toolbarbutton) { height: 100% !important; } + #tabview-button { + list-style-image: url(http://twily.info/img/tabview-button.png?v=2) /* 16x16 px image */ !important; + -moz-image-region: rect(0, 0, 0, 0) !important; + } + + #liberator-completions { background: var(--bg-dark) !important; } + + /* Tabgroup margin top fix */ + #tab-view-deck #tab-view { margin-top: 11px !important; } + #tab-view-deck { background: var(--bg-light) !important; } +} + + +/* Tab Group Page Style (Ctrl+Shift+E) */ +@-moz-document url(chrome://browser/content/tabview.html) { + #content #bg, #actions, body { background: var(--bg-light) !important; } + body * { color: var(--fg-light) !important; } + + body .groupItem, #content #actions, body .undo { + background: var(--bg-dark) !important; + border: 0 !important; border-radius: 0 !important; box-shadow: 0 0 0 0 !important; + } + #content #actions { + opacity: 0 !important; display: none !important; /* block | none */ + transition: .3s ease-out !important; + } + #content #actions:hover { opacity: 1 !important; } + + body .appTabTrayContainer { border: 0 !important; } + body .tab, body .tab .thumb { + box-shadow: 0 0 0 0 !important; border: 0 !important; border-radius: 0 !important; + background: transparent !important; padding : 0 !important; + } + body .tab .favicon { display: none !important; } + body .groupItem .name { border: 0 !important; } + body .tab .tab-title { padding-top: 2px !important; } +} + + +/* AGENT_SHEET */ +@-moz-document url-prefix(http://), url-prefix(https://), url-prefix(chrome://liberator/) { + /* SCROLLBAR */ + scrollbar[orient="vertical"], scrollbar thumb[orient="vertical"], + scrollbar[orient="horizontal"], scrollbar thumb[orient="horizontal"] { + display: none !important; /* none = hide || block = show */ + } + + /* + scrollbar > slider { -moz-appearance: none !important; } + + scrollbar[orient="vertical"] { margin: -3px -7px -3px -3px !important; } + scrollbar[orient='vertical'] > slider { background: #222326 !important; max-width: 5px !important; } + scrollbar[orient='vertical'] > slider > thumb { + -moz-appearance: none !important; + background: #9b79f7 !important; border: 0 !important; + width: 5px !important; max-width: 5px !important; + } + + scrollbar[orient="horizontal"] { margin: -3px -3px -7px -3px !important; } + scrollbar[orient='horizontal'] > slider { background: #222326 !important; max-height: 5px !important; } + scrollbar[orient='horizontal'] > slider > thumb { + -moz-appearance: none !important; + background: #9b79f7 !important; border: 0 !important; + height: 5px !important; max-height: 5px !important; + } + + scrollbar > scrollbarbutton { -moz-appearance: none !important; border: none !important; background: none !important; } + scrollbar[orient='vertical'] > scrollbarbutton { min-height: 0 !important; } + scrollbar[orient='horizontal'] > scrollbarbutton { min-width: 0 !important; } + /**/ +} + + +/* background color around/behind pictures opened in firefox (require html namespace on top) */ +@-moz-document regexp("(https?://|file:///)(.*)\\.(jpeg|jpg|gif|png|apng|svg|bmp|webm|webp)") { + body { background: var(--bg-light) !important; } + img.decoded { background: url(none) !important; } +} + + +/* About:Blank background */ +@-moz-document url(about:blank) { + html,body { background: var(--bg-light) !important; } +} + +/* about:stylish-edit toolbar style */ +@-moz-document regexp("about:stylish-edit.*") { + #main-area, textbox { background: var(--bg-light) !important; } + textbox, grid, columns, rows, separator { border: 0 !important; } + + .devtools-toolbarbutton { background: var(--bg-dark) !important; color: var(--fg-light) !important; } +} + +/*----- Fix for white flash on new tab -----*/ +tabbrowser tabpanels, #appcontent > #content { background: var(--bg-light) !important; } + + + diff --git a/firefox/userContent.css b/firefox/userContent.css new file mode 100755 index 0000000..526e704 --- /dev/null +++ b/firefox/userContent.css @@ -0,0 +1 @@ +// html {margin-right: -14px !important;overflow-y:scroll;overflow-x:scroll} @@ -1,40 +1,49 @@ -# misc settings +## Misc settings title="MPV" -no-osc -no-osd +#no-osc no-osd-bar +script-opts=osc-layout=bottombar + +## Audio Stuffs +#af=drc +ao=pulse +softvol=yes +alang=en,eng,English,jpn,jap,Japanese +audio-channels=2 + + +## Video Stuffs #hwdec=vaapi #vo=vaapi +video-sync=display-resample +display-fps=60 +vo=opengl-hq:interpolation:tscale=robidouxsharp:dither-depth=auto:temporal-dither:source-shader=/home/zephcom/.config/mpv/shaders/deband.glsl:gamma=0.8:target-prim=bt.709:target-trc=bt.1886:blend-subtitles:pbo +force-window -#Mitchell -vo=opengl-hq:interpolation:tscale=mitchell:dither-depth=8:temporal-dither:pbo:target-prim=bt.709:target-trc=bt.1886:source-shader=/home/zephcom/.mpv/shaders/deband.glsl:gamma-auto +demuxer-thread=yes framedrop=vo cache=10000 geometry=50%:50% autofit-larger=90%x90% -audio-channels=2 save-position-on-quit=yes -softvol=yes -ao=pulse -alang=en,eng,English,jpn,jap,Japanese +# Youtube-dl stuffs ytdl -ytdl-format=bestvideo+bestaudio +#ytdl-format=bestvideo+bestaudio # Pretty srt font! slang=en,eng,English osd-font="Liberation Sans" -sub-text-font="Helvetica" -sub-text-font-size=38 -#sub-text-margin-y=14 +sub-text-font="Open Sans Semibold" +sub-text-font-size=48 sub-text-color="#ffffffff" -sub-text-border-color="#ff000000" -sub-text-border-size=2.5 +sub-text-border-color="#220035" +sub-text-border-size=3.5 sub-text-shadow-offset=1 -sub-text-shadow-color="#00000000" -sub-text-spacing=-0.2 +sub-text-shadow-color="#220035" +sub-text-spacing=-0.3 ass-force-style=Kerning=yes demuxer-mkv-subtitle-preroll sub-use-margins @@ -45,8 +54,9 @@ screenshot-format="png" screenshot-png-filter=0 screenshot-png-compression=4 -#really-quiet -# loop weebums +# loop weebums and gifs [extension.webm] loop-file=inf +[extension.gif] +loop-file=inf diff --git a/mpv/input.conf b/mpv/input.conf index 1622822..2abd93b 100644 --- a/mpv/input.conf +++ b/mpv/input.conf @@ -2,3 +2,4 @@ + add volume 2 o ignore F2 cycle_values video-aspect "16:9" "16:10" "4:3" "2.35:1" "-1" +# F3 cycle_values gamma "1.0" "0.9" "0.8" "1.1" diff --git a/mpv/scripts.other/fpsadjust.lua b/mpv/scripts.other/fpsadjust.lua new file mode 100644 index 0000000..61065cf --- /dev/null +++ b/mpv/scripts.other/fpsadjust.lua @@ -0,0 +1,50 @@ +require 'mp.options' +local opt = { + maxiters = 5, -- Frames involving at most this many frames will be + -- considered acceptable. + + maxdelta = 0.01, -- Maximum allowed speed change (setting this too high + -- could cause noticeable change in pitch and tempo) + + mindelta = 0.0005, -- Minimum speed change that would be considered + -- significant enough to be worth calculating. Any lower + -- and it will just play at 100% speed to preserve CPU + -- cycles. +} +read_options(opt) + +function get_scale(ratio, factor) + scale = ratio * factor / math.floor(ratio * factor + 0.5) + delta = math.abs(scale - 1) + + if (delta < opt.mindelta) then + return 1 -- close enough, just use it + end + if (delta > opt.maxdelta) then + return nil -- large deviation, skip + end + return scale -- decent match found +end + +function adjust_speed(event) + clip_fps = mp.get_property_number("fps") + disp_fps = mp.get_property_number("display-fps") + + if not clip_fps or not disp_fps or disp_fps == 0 then + return + end + + for i=1,opt.maxiters do + scale = get_scale(disp_fps / clip_fps, i) + if scale then + break + end + end + + if scale then + mp.set_property("speed", scale) + print("Setting speed to", scale) + end +end + +mp.register_event("playback-restart", adjust_speed) diff --git a/mpv/scripts.other/mpv-progressbar.lua b/mpv/scripts.other/mpv-progressbar.lua new file mode 100644 index 0000000..bbdd9aa --- /dev/null +++ b/mpv/scripts.other/mpv-progressbar.lua @@ -0,0 +1,1052 @@ +local msg = require('mp.msg') +local bar_height = 2 +local hover_zone = 20 +local log = { + debug = function(format, ...) + return msg.debug(format:format(...)) + end, + info = function(format, ...) + return msg.info(format:format(...)) + end, + warn = function(format, ...) + return msg.warn(format:format(...)) + end, + dump = function(item, ignore) + local level = 2 + if "table" ~= type(item) then + msg.info(tostring(item)) + return + end + local count = 1 + local tablecount = 1 + local result = { + "{ @" .. tostring(tablecount) + } + local seen = { + [item] = tablecount + } + local recurse + recurse = function(item, space) + for key, value in pairs(item) do + if not (key == ignore) then + if "table" == type(value) then + if not (seen[value]) then + tablecount = tablecount + 1 + seen[value] = tablecount + count = count + 1 + result[count] = space .. tostring(key) .. ": { @" .. tostring(tablecount) + recurse(value, space .. " ") + count = count + 1 + result[count] = space .. "}" + else + count = count + 1 + result[count] = space .. tostring(key) .. ": @" .. tostring(seen[value]) + end + else + if "string" == type(value) then + value = ("%q"):format(value) + end + count = count + 1 + result[count] = space .. tostring(key) .. ": " .. tostring(value) + end + end + end + end + recurse(item, " ") + count = count + 1 + result[count] = "}" + return msg.info(table.concat(result, "\n")) + end +} +local OSDAggregator +do + local _base_0 = { + addSubscriber = function(self, subscriber) + if not subscriber then + return + end + self.subscriberCount = self.subscriberCount + 1 + subscriber.aggregatorIndex = self.subscriberCount + self.subscribers[self.subscriberCount] = subscriber + self.script[self.subscriberCount] = subscriber:stringify() + end, + removeSubscriber = function(self, index) + table.remove(self.subscribers, index) + table.remove(self.script, index) + self.subscriberCount = self.subscriberCount - 1 + for i = index, self.subscriberCount do + self.subscribers[i].aggregatorIndex = i + end + end, + update = function(self, force) + if force == nil then + force = false + end + local needsRedraw = force + local x, y = mp.get_mouse_pos() + local w, h = mp.get_screen_size() + local needsResize = false + if w ~= self.w or h ~= self.h then + self.w, self.h = w, h + needsResize = true + end + for sub = 1, self.subscriberCount do + local theSub = self.subscribers[sub] + local update = false + if theSub:update(x, y, self.mouseOver) then + update = true + end + if (needsResize and theSub:updateSize(w, h)) or update then + needsRedraw = true + self.script[sub] = theSub:stringify() + end + end + if true == needsRedraw then + return mp.set_osd_ass(self.w, self.h, table.concat(self.script, '\n')) + end + end, + pause = function(self, event, paused) + self.paused = paused + if self.paused then + return self.updateTimer:stop() + else + return self.updateTimer:resume() + end + end, + forceUpdate = function(self) + self.updateTimer:kill() + self:update(true) + if not (self.paused) then + return self.updateTimer:resume() + end + end + } + _base_0.__index = _base_0 + local _class_0 = setmetatable({ + __init = function(self) + self.script = { } + self.subscribers = { } + self.subscriberCount = 0 + self.mouseOver = false + self.w = 0 + self.h = 0 + local redrawFrequency = 0.05 + self.updateTimer = mp.add_periodic_timer(redrawFrequency, (function() + local _base_1 = self + local _fn_0 = _base_1.update + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + mp.register_event('shutdown', function() + return self.updateTimer:kill() + end) + mp.add_key_binding("MOUSE_LEAVE", function() + self.mouseOver = false + end) + return mp.add_key_binding("MOUSE_ENTER", function() + self.mouseOver = true + end) + end, + __base = _base_0, + __name = "OSDAggregator" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + OSDAggregator = _class_0 +end +local AnimationQueue +do + local _base_0 = { + registerAnimation = function(self, animation) + if self.list then + self.list.next = animation + end + animation.prev = self.list + animation.isRegistered = true + self.list = animation + self.animationCount = self.animationCount + 1 + return self:startAnimation() + end, + unregisterAnimation = function(self, animation) + local prev = animation.prev + local next = animation.next + if prev then + prev.next = next + end + if next then + next.prev = prev + end + if self.list == animation then + self.list = prev + end + animation.next = nil + animation.prev = nil + animation.isRegistered = false + self.animationCount = self.animationCount - 1 + if 0 == self.animationCount then + self:stopAnimation() + end + return prev + end, + startAnimation = function(self) + if self.animating then + return + end + self.timer:resume() + self.animating = true + end, + stopAnimation = function(self) + if not (self.animating) then + return + end + self.timer:kill() + self.animating = false + end, + destroyAnimationStack = function(self) + self:stopAnimation() + local currentAnimation = self.list + while currentAnimation do + currentAnimation = self.list.prev + self.list.prev = nil + self.list.next = nil + self.list = currentAnimation + end + end, + animate = function(self) + local currentAnimation = self.list + local currentTime = mp.get_time() + while currentAnimation do + if currentAnimation:update(currentTime) then + currentAnimation = self:unregisterAnimation(currentAnimation) + else + currentAnimation = currentAnimation.prev + end + end + return self.aggregator:forceUpdate() + end + } + _base_0.__index = _base_0 + local _class_0 = setmetatable({ + __init = function(self, aggregator) + self.aggregator = aggregator + self.list = nil + self.animationCount = 0 + self.animating = false + self.timer = mp.add_periodic_timer(0.05, (function() + local _base_1 = self + local _fn_0 = _base_1.animate + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + return self.timer:kill() + end, + __base = _base_0, + __name = "AnimationQueue" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + AnimationQueue = _class_0 +end +local Animation +do + local _base_0 = { + update = function(self, currentTime) + self.currentTime = currentTime + local progress = math.max(0, math.min(1, (self.currentTime - self.startTime) * self.durationR)) + if progress == 1 then + self.isFinished = true + end + if self.accel then + progress = math.pow(progress, self.accel) + end + local value = (1 - progress) * self.initialValue + progress * self.endValue + self:updateCb(value) + if self.isFinished and self.finishedCb then + self:finishedCb() + end + return self.isFinished + end, + interrupt = function(self, reverse, queue) + if reverse ~= self.isReversed then + self:reverse() + end + if not (self.isRegistered) then + self:restart() + return queue:registerAnimation(self) + end + end, + reverse = function(self) + self.isReversed = not self.isReversed + self.initialValue, self.endValue = self.endValue, self.initialValue + self.startTime = 2 * self.currentTime - self.duration - self.startTime + self.accel = 1 / self.accel + end, + restart = function(self) + self.startTime = mp.get_time() + self.currentTime = self.startTime + self.isFinished = false + end + } + _base_0.__index = _base_0 + local _class_0 = setmetatable({ + __init = function(self, initialValue, endValue, duration, updateCb, finishedCb, accel) + if accel == nil then + accel = 1 + end + self.initialValue, self.endValue, self.duration, self.updateCb, self.finishedCb, self.accel = initialValue, endValue, duration, updateCb, finishedCb, accel + self.startTime = mp.get_time() + self.currentTime = self.startTime + self.durationR = 1 / self.duration + self.isFinished = (self.duration <= 0) + self.isRegistered = false + self.isReversed = false + end, + __base = _base_0, + __name = "Animation" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Animation = _class_0 +end +local Rect +do + local _base_0 = { + setPosition = function(self, x, y) + self.x = x or self.x + self.y = y or self.y + end, + setDimensions = function(self, w, h) + self.w = w or self.w + self.h = h or self.h + end, + move = function(self, x, y) + self.x = self.x + (x or 0) + self.y = self.y + (y or 0) + end, + stretch = function(self, w, h) + self.w = self.w + (w or 0) + self.h = self.h + (h or 0) + end, + containsPoint = function(self, x, y) + return ((x >= self.x) and (y >= self.y) and (x < self.x + self.w) and (y < self.y + self.h)) + end + } + _base_0.__index = _base_0 + local _class_0 = setmetatable({ + __init = function(self, x, y, w, h) + self.x, self.y, self.w, self.h = x, y, w, h + end, + __base = _base_0, + __name = "Rect" + }, { + __index = _base_0, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + Rect = _class_0 +end +local Subscriber +do + local _parent_0 = Rect + local _base_0 = { + stringify = function(self) + if not self.hovered and not self.animation.isRegistered then + return "" + end + return table.concat(self.line) + end, + updateSize = function(self, w, h) + self.y = h - hover_zone * bar_height + self.w, self.h = w, hover_zone * bar_height + end, + update = function(self, mouseX, mouseY, mouseOver, hoverCondition) + if hoverCondition == nil then + hoverCondition = self:containsPoint(mouseX, mouseY) + end + local update = self.needsUpdate + self.needsUpdate = false + if mouseOver and hoverCondition then + if not (self.hovered) then + update = true + self.hovered = true + self.animation:interrupt(false, self.animationQueue) + end + else + if self.hovered then + update = true + self.hovered = false + self.animation:interrupt(true, self.animationQueue) + end + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self) + _parent_0.__init(self, 0, 0, 0, 0) + self.hovered = false + self.needsUpdate = false + end, + __base = _base_0, + __name = "Subscriber", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + Subscriber = _class_0 +end +local ProgressBar +do + local _parent_0 = Subscriber + local _base_0 = { + clickUpSeek = function(self) + local x, y = mp.get_mouse_pos() + if self:containsPoint(x, y) then + return mp.commandv("seek", x * 100 / self.w, "absolute-percent", "keyframes") + end + end, + stringify = function(self) + return table.concat(self.line) + end, + updateSize = function(self, w, h) + _parent_0.updateSize(self, w, h) + self.line[2] = ([[%d,%d]]):format(0, h) + self.line[8] = ([[%d 0 %d %d 0 %d]]):format(w * 4, w * 4, bar_height * 4, bar_height * 4) + return true + end, + animateHeight = function(self, animation, value) + self.line[6] = ([[%g]]):format(value) + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + local position = mp.get_property_number('percent-pos', 0) + if position ~= self.lastPosition then + update = true + self.line[4] = ([[%g]]):format(position) + self.lastPosition = position + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self) + self.line = { + [[{\an1\bord0\c&HFFFFFF&\p3\pos(]], + 0, + [[)\fscx]], + 0, + [[\fscy]], + 100, + [[}m 0 0 l ]], + 0 + } + self.lastPosition = 0 + self.animation = Animation(100, 400, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animateHeight + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + return mp.add_key_binding("MOUSE_BTN0", (function() + local _base_1 = self + local _fn_0 = _base_1.clickUpSeek + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + end, + __base = _base_0, + __name = "ProgressBar", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + ProgressBar = _class_0 +end +local ProgressBarBackground +do + local _parent_0 = Subscriber + local _base_0 = { + stringify = function(self) + return table.concat(self.line) + end, + updateSize = function(self, w, h) + _parent_0.updateSize(self, w, h) + self.line[2] = ([[%d,%d]]):format(0, h) + self.line[6] = ([[%d 0 %d %d 0 %d]]):format(w, w, bar_height, bar_height) + return true + end, + animateHeight = function(self, animation, value) + self.line[4] = ([[%g]]):format(value) + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + return _parent_0.update(self, mouseX, mouseY, mouseOver) + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self) + self.line = { + [[{\an1\bord0\c&H262626&\p1\pos(]], + 0, + [[)\fscy]], + 100, + [[}m 0 0 l ]], + 0 + } + self.animation = Animation(100, 400, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animateHeight + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + end, + __base = _base_0, + __name = "ProgressBarBackground", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + ProgressBarBackground = _class_0 +end +local ChapterMarker +do + local _parent_0 = Subscriber + local _base_0 = { + stringify = function(self) + if self.passed then + self.line[2][7] = [[\c&H262626&]] + else + self.line[2][7] = [[\c&HFFFFFF&]] + end + if self.hovered or self.animation.isRegistered then + return table.concat({ + table.concat(self.line[1]), + table.concat(self.line[2]) + }, '\n') + else + return table.concat(self.line[2]) + end + end, + updateSize = function(self, w, h) + self.x = math.floor(w * self.position) + self.y = h - hover_zone * bar_height + self.line[1][2] = ([[%d,%d]]):format(self.x + 10, h - hover_zone - 10) + self.line[2][2] = ([[%d,%d]]):format(self.x + 10, h) + return true + end, + animateAlpha = function(self, animation, value) + self.line[1][4] = ([[%02X]]):format(value) + self.needsUpdate = true + end, + animateSize = function(self, value) + self.line[2][4] = ([[%g]]):format(value * 100 + 100) + self.line[2][6] = ([[%g]]):format(value * 300 + 100) + end, + update = function(self, mouseX, mouseY, mouseOver, position) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + local changed = self.passed + self.passed = position > self.position + update = update or changed ~= self.passed + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue, title, position, w, h) + self.animationQueue, self.position = animationQueue, position + _parent_0.__init(self) + self.x = math.floor(w * self.position) - 10 + self.y = h - hover_zone * bar_height + self.w = 20 + self.h = hover_zone * bar_height + self.line = { + { + [[{\an2\bord2\c&H262626&\3c&HFFFFFF\fs30\pos(]], + ([[%d,%d]]):format(self.x + 10, h - hover_zone - 10), + [[)\alpha&H]], + [[FF]], + ([[&}%s]]):format(title) + }, + { + [[{\an2\bord0\p1\pos(]], + ([[%d,%d]]):format(self.x + 10, h), + [[)\fscx]], + 100, + [[\fscy]], + 100, + [[\c&HFFFFFF&]], + [[}m 0 0 l 2 0 2 2 0 2]] + } + } + self.passed = false + self.animation = Animation(255, 0, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animateAlpha + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + end, + __base = _base_0, + __name = "ChapterMarker", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + ChapterMarker = _class_0 +end +local Chapters +do + local _parent_0 = Subscriber + local _base_0 = { + createMarkers = function(self, w, h) + self.markers = { } + local totalTime = mp.get_property_number('length', 0) + local chapters = mp.get_property_native('chapter-list', { }) + for _index_0 = 1, #chapters do + local chapter = chapters[_index_0] + table.insert(self.markers, ChapterMarker(self.animationQueue, chapter.title, chapter.time / totalTime, w, h)) + end + end, + stringify = function(self) + return table.concat(self.line, '\n') + end, + redrawMarkers = function(self) + self.line = { } + local _list_0 = self.markers + for _index_0 = 1, #_list_0 do + local marker = _list_0[_index_0] + table.insert(self.line, marker:stringify()) + end + end, + updateSize = function(self, w, h) + _parent_0.updateSize(self, w, h) + local _list_0 = self.markers + for _index_0 = 1, #_list_0 do + local marker = _list_0[_index_0] + marker:updateSize(w, h) + end + self:redrawMarkers() + return true + end, + animateSize = function(self, animation, value) + local _list_0 = self.markers + for _index_0 = 1, #_list_0 do + local marker = _list_0[_index_0] + marker:animateSize(value) + end + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + local currentPosition = mp.get_property_number('percent-pos', 0) * 0.01 + local _list_0 = self.markers + for _index_0 = 1, #_list_0 do + local marker = _list_0[_index_0] + if marker:update(mouseX, mouseY, mouseOver, currentPosition) then + update = true + end + end + if update then + self:redrawMarkers() + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self) + self.line = { } + self.markers = { } + self.animation = Animation(0, 1, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animateSize + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + end, + __base = _base_0, + __name = "Chapters", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + Chapters = _class_0 +end +local TimeElapsed +do + local _parent_0 = Subscriber + local _base_0 = { + updateSize = function(self, w, h) + _parent_0.updateSize(self, w, h) + self.line[2] = ([[%g,%g]]):format(self.position, self.y + (hover_zone - 4) * bar_height) + return true + end, + animatePos = function(self, animation, value) + self.position = value + self.line[2] = ([[%g,%g]]):format(self.position, self.y + (hover_zone - 4) * bar_height) + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + local timeElapsed = math.floor(mp.get_property_number('time-pos', 0)) + if timeElapsed ~= self.lastTime then + update = true + self.line[4] = ([[%d:%02d:%02d]]):format(timeElapsed / 3600, (timeElapsed / 60) % 60, timeElapsed % 60) + self.lastTime = timeElapsed + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self) + self.line = { + [[{\fnSource Sans Pro Semibold\bord2\fs30\pos(]], + [[-100,0]], + [[)\3c&H262626&\c&HFFFFFF&\an1}]], + 0 + } + self.lastTime = -1 + self.position = -100 + self.animation = Animation(-100, 2, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animatePos + return function(...) + return _fn_0(_base_1, ...) + end + end)(), nil, 0.25) + end, + __base = _base_0, + __name = "TimeElapsed", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + TimeElapsed = _class_0 +end +local TimeRemaining +do + local _parent_0 = Subscriber + local _base_0 = { + updateSize = function(self, w, h) + _parent_0.updateSize(self, w, h) + self.line[2] = ([[%g,%g]]):format(self.position, self.y + (hover_zone - 4) * bar_height) + return true + end, + animatePos = function(self, animation, value) + self.position = self.w - value + self.line[2] = ([[%g,%g]]):format(self.position, self.y + (hover_zone - 4) * bar_height) + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + local timeRemaining = math.floor(mp.get_property_number('playtime-remaining', 0)) + if timeRemaining ~= self.lastTime then + update = true + self.line[4] = ([[%d:%02d:%02d]]):format(timeRemaining / 3600, (timeRemaining / 60) % 60, timeRemaining % 60) + self.lastTime = timeRemaining + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self, 0, 0, 0, 0) + self.line = { + [[{\fnSource Sans Pro Semibold\bord2\fs30\pos(]], + [[-100,0]], + [[)\3c&H262626&\c&HFFFFFF&\an3}]], + 0 + } + self.lastTime = -1 + self.position = -100 + self.animation = Animation(-100, 4, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animatePos + return function(...) + return _fn_0(_base_1, ...) + end + end)(), nil, 0.25) + end, + __base = _base_0, + __name = "TimeRemaining", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + TimeRemaining = _class_0 +end +local HoverTime +do + local _parent_0 = Subscriber + local _base_0 = { + animateAlpha = function(self, animation, value) + self.line[4] = ([[%02X]]):format(value) + self.needsUpdate = true + end, + update = function(self, mouseX, mouseY, mouseOver) + local update = _parent_0.update(self, mouseX, mouseY, mouseOver) + if mouseX ~= self.lastX or mouseY ~= self.lastY then + self.line[2] = ("%g,%g"):format(math.min(self.w - 130, math.max(120, mouseX)), self.y + (hover_zone - 4) * bar_height) + self.lastX, self.lastY = mouseX, mouseY + local hoverTime = mp.get_property_number('length', 0) * mouseX / self.w + if hoverTime ~= self.lastTime and (self.hovered or self.animation.isRegistered) then + update = true + self.line[6] = ([[%d:%02d:%02d]]):format(hoverTime / 3600, (hoverTime / 60) % 60, hoverTime % 60) + self.lastTime = hoverTime + end + end + return update + end + } + _base_0.__index = _base_0 + setmetatable(_base_0, _parent_0.__base) + local _class_0 = setmetatable({ + __init = function(self, animationQueue) + self.animationQueue = animationQueue + _parent_0.__init(self) + self.line = { + [[{\fnSource Sans Pro Semibold\bord2\fs26\pos(]], + [[-100,0]], + [[)\3c&H262626&\c&HFFFFFF&\an2\&H]], + [[FF]], + [[&}]], + 0 + } + self.lastTime = 0 + self.lastX = -1 + self.lastY = -1 + self.position = -100 + self.animation = Animation(255, 0, 0.25, (function() + local _base_1 = self + local _fn_0 = _base_1.animateAlpha + return function(...) + return _fn_0(_base_1, ...) + end + end)()) + end, + __base = _base_0, + __name = "HoverTime", + __parent = _parent_0 + }, { + __index = function(cls, name) + local val = rawget(_base_0, name) + if val == nil then + return _parent_0[name] + else + return val + end + end, + __call = function(cls, ...) + local _self_0 = setmetatable({}, _base_0) + cls.__init(_self_0, ...) + return _self_0 + end + }) + _base_0.__class = _class_0 + if _parent_0.__inherited then + _parent_0.__inherited(_parent_0, _class_0) + end + HoverTime = _class_0 +end +local aggregator = OSDAggregator() +local animationQueue = AnimationQueue(aggregator) +local progressBar = ProgressBar(animationQueue) +local progressBarBackground = ProgressBarBackground(animationQueue) +local chapters = Chapters(animationQueue) +local timeElapsed = TimeElapsed(animationQueue) +local timeRemaining = TimeRemaining(animationQueue) +local hoverTime = HoverTime(animationQueue) +aggregator:addSubscriber(progressBarBackground) +aggregator:addSubscriber(progressBar) +aggregator:addSubscriber(chapters) +aggregator:addSubscriber(timeElapsed) +aggregator:addSubscriber(timeRemaining) +aggregator:addSubscriber(hoverTime) +local notFrameStepping = true +mp.add_key_binding('.', 'mp_progbar_stepforward', function() + notFrameStepping = false + return mp.commandv('frame_step') +end, { + repeatable = true +}) +mp.add_key_binding(',', 'mp_progbar_stepbackward', function() + notFrameStepping = false + return mp.commandv('frame_back_step') +end, { + repeatable = true +}) +mp.observe_property('pause', 'bool', PauseIndicatorWrapper) +local initDraw +initDraw = function() + mp.unregister_event(initDraw) + local width, height = mp.get_screen_size() + chapters:createMarkers(width, height) +end +local fileLoaded +fileLoaded = function() + return mp.register_event('playback-restart', initDraw) +end +return mp.register_event('file-loaded', fileLoaded) diff --git a/mpv/scripts/autoload.lua b/mpv/scripts/autoload.lua new file mode 100644 index 0000000..ffe6ddb --- /dev/null +++ b/mpv/scripts/autoload.lua @@ -0,0 +1,121 @@ +-- This script automatically loads playlist entries before and after the +-- the currently played file. It does so by scanning the directory a file is +-- located in when starting playback. It sorts the directory entries +-- alphabetically, and adds entries before and after the current file to +-- the internal playlist. (It stops if the it would add an already existing +-- playlist entry at the same position - this makes it "stable".) +-- Add at most 5 * 2 files when starting a file (before + after). +MAXENTRIES = 5 + +function Set (t) + local set = {} + for _, v in pairs(t) do set[v] = true end + return set +end + +EXTENSIONS = Set { + 'mkv', 'avi', 'mp4', 'ogv', 'webm', 'rmvb', 'flv', 'wmv', 'mpeg', 'mpg', 'm4v', '3gp', + 'mp3', 'wav', 'ogv', 'flac', 'm4a', 'wma', +} + +mputils = require 'mp.utils' + +function add_files_at(index, files) + index = index - 1 + local oldcount = mp.get_property_number("playlist-count", 1) + for i = 1, #files do + mp.commandv("loadfile", files[i], "append") + mp.commandv("playlist_move", oldcount + i - 1, index + i - 1) + end +end + +function get_extension(path) + return string.match(path, "%.([^%.]+)$" ) +end + +table.filter = function(t, iter) + for i = #t, 1, -1 do + if not iter(t[i]) then + table.remove(t, i) + end + end +end + +function find_and_add_entries() + local path = mp.get_property("path", "") + local dir, filename = mputils.split_path(path) + if #dir == 0 then + return + end + local isplaylist = mp.get_property("playlist-count") + if #isplaylist > 1 then + return + end + + local files = mputils.readdir(dir, "files") + if files == nil then + return + end + table.filter(files, function (v, k) + local ext = get_extension(v) + if ext == nil then + return false + end + return EXTENSIONS[string.lower(ext)] + end) + table.sort(files, function (a, b) + return string.lower(a) < string.lower(b) + end) + + if dir == "." then + dir = "" + end + + local pl = mp.get_property_native("playlist", {}) + local pl_current = mp.get_property_number("playlist-pos", 0) + 1 + -- Find the current pl entry (dir+"/"+filename) in the sorted dir list + local current + for i = 1, #files do + if files[i] == filename then + current = i + break + end + end + if current == nil then + return + end + + local append = {[-1] = {}, [1] = {}} + for direction = -1, 1, 2 do -- 2 iterations, with direction = -1 and +1 + for i = 1, MAXENTRIES do + local file = files[current + i * direction] + local pl_e = pl[pl_current + i * direction] + if file == nil or file[1] == "." then + break + end + + local filepath = dir .. file + if pl_e then + -- If there's a playlist entry, and it's the same file, stop. + if pl_e.filename == filepath then + break + end + end + + if direction == -1 then + if pl_current == 1 then -- never add additional entries in the middle + mp.msg.info("Prepending " .. file) + table.insert(append[-1], 1, filepath) + end + else + mp.msg.info("Adding " .. file) + table.insert(append[1], filepath) + end + end + end + + add_files_at(pl_current + 1, append[1]) + add_files_at(pl_current, append[-1]) +end + +mp.register_event("start-file", find_and_add_entries) diff --git a/mpv/scripts/autosub.lua b/mpv/scripts/autosub.lua new file mode 100644 index 0000000..a05206f --- /dev/null +++ b/mpv/scripts/autosub.lua @@ -0,0 +1,24 @@ +-- default keybinding: b +-- add the following to your input.conf to change the default keybinding: +-- keyname script_binding auto_load_subs +local utils = require 'mp.utils' +function load_sub_fn() + subl = "/usr/bin/subliminal" -- use 'which subliminal' to find the path + mp.msg.info("Searching subtitle") + mp.osd_message("Searching subtitle") + t = {} + t.args = {subl, "download", "-s", "-l", "en", mp.get_property("path")} + res = utils.subprocess(t) + if res.status == 0 then + sub_path = string.gsub(mp.get_property("path"), "%.%w+$", ".srt") + mp.osd_message(sub_path) + mp.commandv("sub_add", sub_path) + mp.msg.info("Subtitle download succeeded") + mp.osd_message("Subtitle download succeeded") + else + mp.msg.warn("Subtitle download failed") + mp.osd_message("Subtitle download failed") + end +end + +mp.add_key_binding("b", "auto_load_subs", load_sub_fn) diff --git a/mpv/scripts/stats.lua b/mpv/scripts/stats.lua new file mode 100644 index 0000000..f844d21 --- /dev/null +++ b/mpv/scripts/stats.lua @@ -0,0 +1,263 @@ +-- Display some stats. +-- +-- You can invoke the script with "i" by default or create a different key +-- binding in input.conf using "<yourkey> script_binding stats". +-- +-- The style is configurable through a config file named "lua-settings/stats.conf" +-- located in your mpv directory. +-- +-- Please note: not every property is always available and therefore not always +-- visible. + +local options = require 'mp.options' + +-- Options +local o = { + ass_formatting = true, + duration = 3, + debug = false, + + -- Text style + font = "Source Sans Pro", + font_size = 11, + font_color = "FFFFFF", + border_size = 1.0, + border_color = "262626", + shadow_x_offset = 0.0, + shadow_y_offset = 0.0, + shadow_color = "000000", + alpha = "11", + + -- Custom header for ASS tags to style the text output. + -- Specifying this will ignore the text style values above and just + -- use this string instead. + custom_header = "", + + -- Text formatting + -- With ASS + nl = "\\N", + prop_indent = "\\h\\h\\h\\h\\h", + kv_sep = "\\h\\h", + b1 = "{\\b1}", + b0 = "{\\b0}", + -- Without ASS + no_ass_nl = "\n", + no_ass_prop_indent = "\t", + no_ass_kv_sep = " ", + no_ass_b1 = "\027[1m", + no_ass_b0 = "\027[0m", +} +options.read_options(o) + + +function main() + local stats = { + header = "", + file = "", + video = "", + audio = "" + } + + o.ass_formatting = o.ass_formatting and has_vo_window() + if not o.ass_formatting then + o.nl = o.no_ass_nl + o.prop_indent = o.no_ass_prop_indent + o.kv_sep = o.no_ass_kv_sep + if not has_ansi() then + o.b1 = "" + o.b0 = "" + else + o.b1 = o.no_ass_b1 + o.b0 = o.no_ass_b0 + end + end + + add_header(stats) + add_file(stats) + add_video(stats) + add_audio(stats) + + mp.osd_message(join_stats(stats), o.duration) +end + + +function add_file(s) + local sec = "file" + s[sec] = "" + + append_property(s, sec, "filename", {prefix="File:", nl="", indent=""}) + append_property(s, sec, "metadata/title", {prefix="Title:"}) + append_property(s, sec, "chapter", {prefix="Chapter:"}) + if append_property(s, sec, "cache-used", {prefix="Cache:"}) then + append_property(s, sec, "demuxer-cache-duration", + {prefix="+", suffix=" sec", nl="", indent=o.kv_sep, + prefix_sep="", no_prefix_markup=true}) + end +end + + +function add_video(s) + local sec = "video" + s[sec] = "" + if not has_video() then + return + end + + if append_property(s, sec, "video-codec", {prefix="Video:", nl="", indent=""}) then + append_property(s, sec, "hwdec-active", + {prefix="(hwdec)", nl="", indent=" ", + no_prefix_markup=true, no_value=true}, + {no=true}) + end + append_property(s, sec, "avsync", {prefix="A-V:"}) + if append_property(s, sec, "drop-frame-count", {prefix="Dropped:"}) then + append_property(s, sec, "vo-drop-frame-count", {prefix="VO:", nl=""}) + end + if append_property(s, sec, "fps", {prefix="FPS:", suffix=" (specified)"}) then + append_property(s, sec, "estimated-vf-fps", + {suffix=" (estimated)", nl="", indent=""}) + else + append_property(s, sec, "estimated-vf-fps", + {prefix="FPS:", suffix=" (estimated)"}) + end + if append_property(s, sec, "video-params/w", {prefix="Native Resolution:"}) then + append_property(s, sec, "video-params/h", + {prefix="x", nl="", indent=" ", prefix_sep=" ", no_prefix_markup=true}) + end + append_property(s, sec, "window-scale", {prefix="Window Scale:"}) + append_property(s, sec, "video-params/aspect", {prefix="Aspect Ratio:"}) + append_property(s, sec, "video-params/pixelformat", {prefix="Pixel format:"}) + append_property(s, sec, "video-params/colormatrix", {prefix="Colormatrix:"}) + append_property(s, sec, "video-params/primaries", {prefix="Primaries:"}) + append_property(s, sec, "video-params/colorlevels", {prefix="Levels:"}) + append_property(s, sec, "packet-video-bitrate", {prefix="Bitrate:", suffix=" kbps"}) +end + + +function add_audio(s) + local sec = "audio" + s[sec] = "" + if not has_audio() then + return + end + + append_property(s, sec, "audio-codec", {prefix="Audio:", nl="", indent=""}) + append_property(s, sec, "audio-params/samplerate", {prefix="Sample Rate:", suffix=" Hz"}) + append_property(s, sec, "audio-params/channel-count", {prefix="Channels:"}) + append_property(s, sec, "packet-audio-bitrate", {prefix="Bitrate:", suffix=" kbps"}) +end + + +function add_header(s) + if not o.ass_formatting then + s.header = "" + return + end + if o.custom_header and o.custom_header ~= "" then + s.header = set_ASS(true) .. o.custom_header + else + s.header = string.format("%s{\\fs%d}{\\fn%s}{\\bord%f}{\\3c&H%s&}{\\1c&H%s&}" .. + "{\\alpha&H%s&}{\\xshad%f}{\\yshad%f}{\\4c&H%s&}", + set_ASS(true), o.font_size, o.font, o.border_size, + o.border_color, o.font_color, o.alpha, o.shadow_x_offset, + o.shadow_y_offset, o.shadow_color) + end +end + + +-- Format and append a property. +-- A property whose value is either `nil` or empty (hereafter called "invalid") +-- is skipped and not appended. +-- Returns `false` in case nothing was appended, otherwise `true`. +-- +-- s : Table containing key `sec`. +-- sec : Existing key in table `s`, value treated as a string. +-- property: The property to query and format (based on its OSD representation). +-- attr : Optional table to overwrite certain (formatting) attributes for +-- this property. +-- exclude : Optional table containing keys which are considered invalid values +-- for this property. Specifying this will replace empty string as +-- default invalid value (nil is always invalid). +function append_property(s, sec, prop, attr, excluded) + excluded = excluded or {[""] = true} + local ret = mp.get_property_osd(prop) + if not ret or excluded[ret] then + if o.debug then + print("No value for property: " .. prop) + end + return false + end + + attr.prefix_sep = attr.prefix_sep or o.kv_sep + attr.indent = attr.indent or o.prop_indent + attr.nl = attr.nl or o.nl + attr.suffix = attr.suffix or "" + attr.prefix = attr.prefix or "" + attr.no_prefix_markup = attr.no_prefix_markup or false + attr.prefix = attr.no_prefix_markup and attr.prefix or b(attr.prefix) + ret = attr.no_value and "" or ret + + s[sec] = string.format("%s%s%s%s%s%s%s", s[sec], attr.nl, attr.indent, + attr.prefix, attr.prefix_sep, no_ASS(ret), attr.suffix) + return true +end + + +function no_ASS(t) + return set_ASS(false) .. t .. set_ASS(true) +end + + +function set_ASS(b) + if not o.ass_formatting then + return "" + end + return mp.get_property_osd("osd-ass-cc/" .. (b and "0" or "1")) +end + + +function join_stats(s) + r = s.header .. s.file + + if s.video and s.video ~= "" then + r = r .. o.nl .. o.nl .. s.video + end + if s.audio and s.audio ~= "" then + r = r .. o.nl .. o.nl .. s.audio + end + + return r +end + + +function has_vo_window() + return mp.get_property("vo-configured") == "yes" +end + + +function has_video() + local r = mp.get_property("video") + return r and r ~= "no" and r ~= "" +end + + +function has_audio() + local r = mp.get_property("audio") + return r and r ~= "no" and r ~= "" +end + +function has_ansi() + local is_windows = type(package) == 'table' and type(package.config) == 'string' and package.config:sub(1,1) == '\\' + if is_windows then + return os.getenv("ANSICON") + end + return true +end + +function b(t) + return o.b1 .. t .. o.b0 +end + + + +mp.add_key_binding("i", mp.get_script_name(), main, {repeatable=true}) diff --git a/tmux.conf b/tmux/tmux.conf index ea85d4a..ea85d4a 100644 --- a/tmux.conf +++ b/tmux/tmux.conf diff --git a/weechat.conf b/weechat/weechat.conf index 88a14f0..88a14f0 100644 --- a/weechat.conf +++ b/weechat/weechat.conf |