diff options
Diffstat (limited to 'config/X')
-rw-r--r-- | config/X/alacritty/alacritty.yml | 951 | ||||
-rw-r--r-- | config/X/mpv/input.conf | 204 | ||||
-rwxr-xr-x | config/X/mpv/mpv.conf | 28 | ||||
-rw-r--r-- | config/X/mpv/scripts/script-opts/webm.conf | 78 | ||||
-rwxr-xr-x | config/X/mpv/scripts/script-opts/youtube-quality.conf | 41 | ||||
-rw-r--r-- | config/X/mpv/scripts/webm.lua | 2914 | ||||
-rwxr-xr-x | config/X/mpv/scripts/youtube-quality.lua | 275 |
7 files changed, 0 insertions, 4491 deletions
diff --git a/config/X/alacritty/alacritty.yml b/config/X/alacritty/alacritty.yml deleted file mode 100644 index e5664f1..0000000 --- a/config/X/alacritty/alacritty.yml +++ /dev/null @@ -1,951 +0,0 @@ -# Configuration for Alacritty, the GPU enhanced terminal emulator. - -# Import additional configuration files -# -# Imports are loaded in order, skipping all missing files, with the importing -# file being loaded last. If a field is already present in a previous import, it -# will be replaced. -# -# All imports must either be absolute paths starting with `/`, or paths relative -# to the user's home directory starting with `~/`. -#import: -# - /path/to/alacritty.yml - -# Any items in the `env` entry below will be added as -# environment variables. Some entries may override variables -# set by alacritty itself. -env: - # TERM variable - # - # This value is used to set the `$TERM` environment variable for - # each instance of Alacritty. If it is not present, alacritty will - # check the local terminfo database and use `alacritty` if it is - # available, otherwise `xterm-256color` is used. - TERM: xterm-256color - -window: - # Window dimensions (changes require restart) - # - # Number of lines/columns (not pixels) in the terminal. The number of columns - # must be at least `2`, while using a value of `0` for columns and lines will - # fall back to the window manager's recommended size. - #dimensions: - # columns: 0 - # lines: 0 - - # Window position (changes require restart) - # - # Specified in number of pixels. - # If the position is not set, the window manager will handle the placement. - #position: - # x: 0 - # y: 0 - - # Window padding (changes require restart) - # - # Blank space added around the window in pixels. This padding is scaled - # by DPI and the specified value is always added at both opposing sides. - padding: - x: 2 - y: 1 - - # Spread additional padding evenly around the terminal content. - #dynamic_padding: false - - # Window decorations - # - # Values for `decorations`: - # - full: Borders and title bar - # - none: Neither borders nor title bar - # - # Values for `decorations` (macOS only): - # - transparent: Title bar, transparent background and title bar buttons - # - buttonless: Title bar, transparent background and no title bar buttons - decorations: none - - # Background opacity - # - # Window opacity as a floating point number from `0.0` to `1.0`. - # The value `0.0` is completely transparent and `1.0` is opaque. - opacity: 0.87 - - # Startup Mode (changes require restart) - # - # Values for `startup_mode`: - # - Windowed - # - Maximized - # - Fullscreen - # - # Values for `startup_mode` (macOS only): - # - SimpleFullscreen - #startup_mode: Windowed - - # Window title - #title: Alacritty - - # Allow terminal applications to change Alacritty's window title. - #dynamic_title: true - - # Window class (Linux/BSD only): - #class: - # Application instance name - #instance: Alacritty - # General application class - #general: Alacritty - - # GTK theme variant (Linux/BSD only) - # - # Override the variant of the GTK theme. Commonly supported values are `dark` - # and `light`. Set this to `None` to use the default theme variant. - #gtk_theme_variant: None - -scrolling: - # Maximum number of lines in the scrollback buffer. - # Specifying '0' will disable scrolling. - history: 10000 - - # Scrolling distance multiplier. - #multiplier: 3 - -# Font configuration -font: - # Normal (roman) font face - normal: - # Font family - # - # Default: - # - (macOS) Menlo - # - (Linux/BSD) monospace - # - (Windows) Consolas - family: monospace - - # The `style` can be specified to pick a specific face. - #style: Regular - - # Bold font face - # bold: - # Font family - # - # If the bold family is not specified, it will fall back to the - # value specified for the normal font. - #family: monospace - - # The `style` can be specified to pick a specific face. - #style: Bold - - # Italic font face - #italic: - # Font family - # - # If the italic family is not specified, it will fall back to the - # value specified for the normal font. - #family: monospace - - # The `style` can be specified to pick a specific face. - #style: Italic - - # Bold italic font face - #bold_italic: - # Font family - # - # If the bold italic family is not specified, it will fall back to the - # value specified for the normal font. - #family: monospace - - # The `style` can be specified to pick a specific face. - #style: Bold Italic - - # Point size - size: 10.0 - - # Offset is the extra space around each character. `offset.y` can be thought - # of as modifying the line spacing, and `offset.x` as modifying the letter - # spacing. - offset: - x: 0 - y: 0 - - # Glyph offset determines the locations of the glyphs within their cells with - # the default being at the bottom. Increasing `x` moves the glyph to the - # right, increasing `y` moves the glyph upward. - #glyph_offset: - # x: 0 - # y: 0 - - # Thin stroke font rendering (macOS only) - # - # Thin strokes are suitable for retina displays, but for non-retina screens - # it is recommended to set `use_thin_strokes` to `false`. - #use_thin_strokes: true - - # Use built-in font for box drawing characters. - # - # If `true`, Alacritty will use a custom built-in font for box drawing - # characters (Unicode points 2500 - 259f). - # - # builtin_box_drawing: true - -# If `true`, bold text is drawn using the bright color variants. -#draw_bold_text_with_bright_colors: false - -# Colors (Tomorrow Night) -#colors: - # Default colors - #primary: - # background: '#1d1f21' - # foreground: '#c5c8c6' - - # Bright and dim foreground colors - # - # The dimmed foreground color is calculated automatically if it is not - # present. If the bright foreground color is not set, or - # `draw_bold_text_with_bright_colors` is `false`, the normal foreground - # color will be used. - #dim_foreground: '#828482' - #bright_foreground: '#eaeaea' - - # Cursor colors - # - # Colors which should be used to draw the terminal cursor. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #cursor: - # text: CellBackground - # cursor: CellForeground - - # Vi mode cursor colors - # - # Colors for the cursor when the vi mode is active. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #vi_mode_cursor: - # text: CellBackground - # cursor: CellForeground - - # Search colors - # - # Colors used for the search bar and match highlighting. - #search: - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #matches: - # foreground: '#000000' - # background: '#ffffff' - #focused_match: - # foreground: '#ffffff' - # background: '#000000' - - #bar: - # background: '#c5c8c6' - # foreground: '#1d1f21' - - # Keyboard regex hints - #hints: - # First character in the hint label - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #start: - # foreground: '#1d1f21' - # background: '#e9ff5e' - - # All characters after the first one in the hint label - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #end: - # foreground: '#e9ff5e' - # background: '#1d1f21' - - # Line indicator - # - # Color used for the indicator displaying the position in history during - # search and vi mode. - # - # By default, these will use the opposing primary color. - #line_indicator: - # foreground: None - # background: None - - # Selection colors - # - # Colors which should be used to draw the selection area. - # - # Allowed values are CellForeground/CellBackground, which reference the - # affected cell, or hexadecimal colors like #ff00ff. - #selection: - # text: CellBackground - # background: CellForeground - - # Normal colors - #normal: - # black: '#1d1f21' - # red: '#cc6666' - # green: '#b5bd68' - # yellow: '#f0c674' - # blue: '#81a2be' - # magenta: '#b294bb' - # cyan: '#8abeb7' - # white: '#c5c8c6' - - # Bright colors - #bright: - # black: '#666666' - # red: '#d54e53' - # green: '#b9ca4a' - # yellow: '#e7c547' - # blue: '#7aa6da' - # magenta: '#c397d8' - # cyan: '#70c0b1' - # white: '#eaeaea' - - # Dim colors - # - # If the dim colors are not set, they will be calculated automatically based - # on the `normal` colors. - #dim: - # black: '#131415' - # red: '#864343' - # green: '#777c44' - # yellow: '#9e824c' - # blue: '#556a7d' - # magenta: '#75617b' - # cyan: '#5b7d78' - # white: '#828482' - - # Indexed Colors - # - # The indexed colors include all colors from 16 to 256. - # When these are not set, they're filled with sensible defaults. - # - # Example: - # `- { index: 16, color: '#ff00ff' }` - # - #indexed_colors: [] - - # Transparent cell backgrounds - # - # Whether or not `window.opacity` applies to all cell backgrounds or only to - # the default background. When set to `true` all cells will be transparent - # regardless of their background color. - #transparent_background_colors: false - -# Bell -# -# The bell is rung every time the BEL control character is received. -#bell: - # Visual Bell Animation - # - # Animation effect for flashing the screen when the visual bell is rung. - # - # Values for `animation`: - # - Ease - # - EaseOut - # - EaseOutSine - # - EaseOutQuad - # - EaseOutCubic - # - EaseOutQuart - # - EaseOutQuint - # - EaseOutExpo - # - EaseOutCirc - # - Linear - #animation: EaseOutExpo - - # Duration of the visual bell flash in milliseconds. A `duration` of `0` will - # disable the visual bell animation. - #duration: 0 - - # Visual bell animation color. - #color: '#ffffff' - - # Bell Command - # - # This program is executed whenever the bell is rung. - # - # When set to `command: None`, no command will be executed. - # - # Example: - # command: - # program: notify-send - # args: ["Hello, World!"] - # - #command: None - -#selection: - # This string contains all characters that are used as separators for - # "semantic words" in Alacritty. - #semantic_escape_chars: ",│`|:\"' ()[]{}<>\t" - - # When set to `true`, selected text will be copied to the primary clipboard. - #save_to_clipboard: false - -cursor: - # Cursor style - style: - # Cursor shape - # - # Values for `shape`: - # - ▇ Block - # - _ Underline - # - | Beam - shape: Block - - # Cursor blinking state - # - # Values for `blinking`: - # - Never: Prevent the cursor from ever blinking - # - Off: Disable blinking by default - # - On: Enable blinking by default - # - Always: Force the cursor to always blink - blinking: Off - - # Vi mode cursor style - # - # If the vi mode cursor style is `None` or not specified, it will fall back to - # the style of the active value of the normal cursor. - # - # See `cursor.style` for available options. - #vi_mode_style: None - - # Cursor blinking interval in milliseconds. - #blink_interval: 750 - - # If this is `true`, the cursor will be rendered as a hollow box when the - # window is not focused. - #unfocused_hollow: true - - # Thickness of the cursor relative to the cell width as floating point number - # from `0.0` to `1.0`. - #thickness: 0.15 - -# Live config reload (changes require restart) -live_config_reload: true - -# Shell -# -# You can set `shell.program` to the path of your favorite shell, e.g. -# `/bin/fish`. Entries in `shell.args` are passed unmodified as arguments to the -# shell. -# -# Default: -# - (macOS) /bin/bash --login -# - (Linux/BSD) user login shell -# - (Windows) powershell -# shell: -# program: /bin/bash - # args: - # - --login - -# Startup directory -# -# Directory the shell is started in. If this is unset, or `None`, the working -# directory of the parent process will be used. -#working_directory: None - -# Send ESC (\x1b) before characters when alt is pressed. -#alt_send_esc: true - -# Offer IPC using `alacritty msg` (unix only) -#ipc_socket: true - -#mouse: - # Click settings - # - # The `double_click` and `triple_click` settings control the time - # alacritty should wait for accepting multiple clicks as one double - # or triple click. - #double_click: { threshold: 300 } - #triple_click: { threshold: 300 } - - # If this is `true`, the cursor is temporarily hidden when typing. - #hide_when_typing: false - -# Regex hints -# -# Terminal hints can be used to find text in the visible part of the terminal -# and pipe it to other applications. -hints: - # Keys used for the hint labels. - #alphabet: "jfkdls;ahgurieowpq" - - # List with all available hints - # - # Each hint must have a `regex` and either an `action` or a `command` field. - # The fields `mouse`, `binding` and `post_processing` are optional. - # - # The fields `command`, `binding.key`, `binding.mods`, `binding.mode` and - # `mouse.mods` accept the same values as they do in the `key_bindings` section. - # - # The `mouse.enabled` field controls if the hint should be underlined while - # the mouse with all `mouse.mods` keys held or the vi mode cursor is above it. - # - # If the `post_processing` field is set to `true`, heuristics will be used to - # shorten the match if there are characters likely not to be part of the hint - # (e.g. a trailing `.`). This is most useful for URIs. - # - # Values for `action`: - # - Copy - # Copy the hint's text to the clipboard. - # - Paste - # Paste the hint's text to the terminal or search. - # - Select - # Select the hint's text. - # - MoveViModeCursor - # Move the vi mode cursor to the beginning of the hint. - enabled: - - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ - [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" - command: linkhandler - post_processing: true - mouse: - enabled: true - mods: Control - binding: - key: U - mods: Control|Shift - - regex: "(ipfs:|ipns:|magnet:|mailto:|gemini:|gopher:|https:|http:|news:|file:|git:|ssh:|ftp:)\ - [^\u0000-\u001F\u007F-\u009F<>\"\\s{-}\\^⟨⟩`]+" - action: Copy - post_processing: false - binding: - key: L - mods: Control|Shift - - regex: "([0-9]{2}[0-9]*)" - action: Copy - post_processing: false - binding: - key: N - mods: Control|Shift - - regex: "([0-9a-f]{12,128})|([[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3}\\.[[:digit:]]{1,3})" - action: Copy - post_processing: false - binding: - key: I - mods: Control|Shift - -# Mouse bindings are specified as a list of objects, much like the key -# bindings further below. -# -# To trigger mouse bindings when an application running within Alacritty -# captures the mouse, the `Shift` modifier is automatically added as a -# requirement. -# -# Each mouse binding will specify a: -# -# - `mouse`: -# -# - Middle -# - Left -# - Right -# - Numeric identifier such as `5` -# -# - `action` (see key bindings for actions not exclusive to mouse mode) -# -# - Mouse exclusive actions: -# -# - ExpandSelection -# Expand the selection to the current mouse cursor location. -# -# And optionally: -# -# - `mods` (see key bindings) -#mouse_bindings: -# - { mouse: Right, action: ExpandSelection } -# - { mouse: Right, mods: Control, action: ExpandSelection } -# - { mouse: Middle, mode: ~Vi, action: PasteSelection } - -# Key bindings -# -# Key bindings are specified as a list of objects. For example, this is the -# default paste binding: -# -# `- { key: V, mods: Control|Shift, action: Paste }` -# -# Each key binding will specify a: -# -# - `key`: Identifier of the key pressed -# -# - A-Z -# - F1-F24 -# - Key0-Key9 -# -# A full list with available key codes can be found here: -# https://docs.rs/glutin/*/glutin/event/enum.VirtualKeyCode.html#variants -# -# Instead of using the name of the keys, the `key` field also supports using -# the scancode of the desired key. Scancodes have to be specified as a -# decimal number. This command will allow you to display the hex scancodes -# for certain keys: -# -# `showkey --scancodes`. -# -# Then exactly one of: -# -# - `chars`: Send a byte sequence to the running application -# -# The `chars` field writes the specified string to the terminal. This makes -# it possible to pass escape sequences. To find escape codes for bindings -# like `PageUp` (`"\x1b[5~"`), you can run the command `showkey -a` outside -# of tmux. Note that applications use terminfo to map escape sequences back -# to keys. It is therefore required to update the terminfo when changing an -# escape sequence. -# -# - `action`: Execute a predefined action -# -# - ToggleViMode -# - SearchForward -# Start searching toward the right of the search origin. -# - SearchBackward -# Start searching toward the left of the search origin. -# - Copy -# - Paste -# - IncreaseFontSize -# - DecreaseFontSize -# - ResetFontSize -# - ScrollPageUp -# - ScrollPageDown -# - ScrollHalfPageUp -# - ScrollHalfPageDown -# - ScrollLineUp -# - ScrollLineDown -# - ScrollToTop -# - ScrollToBottom -# - ClearHistory -# Remove the terminal's scrollback history. -# - Hide -# Hide the Alacritty window. -# - Minimize -# Minimize the Alacritty window. -# - Quit -# Quit Alacritty. -# - ToggleFullscreen -# - SpawnNewInstance -# Spawn a new instance of Alacritty. -# - CreateNewWindow -# Create a new Alacritty window from the current process. -# - ClearLogNotice -# Clear Alacritty's UI warning and error notice. -# - ClearSelection -# Remove the active selection. -# - ReceiveChar -# - None -# -# - Vi mode exclusive actions: -# -# - Open -# Perform the action of the first matching hint under the vi mode cursor -# with `mouse.enabled` set to `true`. -# - ToggleNormalSelection -# - ToggleLineSelection -# - ToggleBlockSelection -# - ToggleSemanticSelection -# Toggle semantic selection based on `selection.semantic_escape_chars`. -# -# - Vi mode exclusive cursor motion actions: -# -# - Up -# One line up. -# - Down -# One line down. -# - Left -# One character left. -# - Right -# One character right. -# - First -# First column, or beginning of the line when already at the first column. -# - Last -# Last column, or beginning of the line when already at the last column. -# - FirstOccupied -# First non-empty cell in this terminal row, or first non-empty cell of -# the line when already at the first cell of the row. -# - High -# Top of the screen. -# - Middle -# Center of the screen. -# - Low -# Bottom of the screen. -# - SemanticLeft -# Start of the previous semantically separated word. -# - SemanticRight -# Start of the next semantically separated word. -# - SemanticLeftEnd -# End of the previous semantically separated word. -# - SemanticRightEnd -# End of the next semantically separated word. -# - WordLeft -# Start of the previous whitespace separated word. -# - WordRight -# Start of the next whitespace separated word. -# - WordLeftEnd -# End of the previous whitespace separated word. -# - WordRightEnd -# End of the next whitespace separated word. -# - Bracket -# Character matching the bracket at the cursor's location. -# - SearchNext -# Beginning of the next match. -# - SearchPrevious -# Beginning of the previous match. -# - SearchStart -# Start of the match to the left of the vi mode cursor. -# - SearchEnd -# End of the match to the right of the vi mode cursor. -# -# - Search mode exclusive actions: -# - SearchFocusNext -# Move the focus to the next search match. -# - SearchFocusPrevious -# Move the focus to the previous search match. -# - SearchConfirm -# - SearchCancel -# - SearchClear -# Reset the search regex. -# - SearchDeleteWord -# Delete the last word in the search regex. -# - SearchHistoryPrevious -# Go to the previous regex in the search history. -# - SearchHistoryNext -# Go to the next regex in the search history. -# -# - macOS exclusive actions: -# - ToggleSimpleFullscreen -# Enter fullscreen without occupying another space. -# -# - Linux/BSD exclusive actions: -# -# - CopySelection -# Copy from the selection buffer. -# - PasteSelection -# Paste from the selection buffer. -# -# - `command`: Fork and execute a specified command plus arguments -# -# The `command` field must be a map containing a `program` string and an -# `args` array of command line parameter strings. For example: -# `{ program: "alacritty", args: ["-e", "vttest"] }` -# -# And optionally: -# -# - `mods`: Key modifiers to filter binding actions -# - Command -# - Control -# - Option -# - Super -# - Shift -# - Alt -# -# Multiple `mods` can be combined using `|` like this: -# `mods: Control|Shift`. -# Whitespace and capitalization are relevant and must match the example. -# -# - `mode`: Indicate a binding for only specific terminal reported modes -# -# This is mainly used to send applications the correct escape sequences -# when in different modes. -# -# - AppCursor -# - AppKeypad -# - Search -# - Alt -# - Vi -# -# A `~` operator can be used before a mode to apply the binding whenever -# the mode is *not* active, e.g. `~Alt`. -# -# Bindings are always filled by default, but will be replaced when a new -# binding with the same triggers is defined. To unset a default binding, it can -# be mapped to the `ReceiveChar` action. Alternatively, you can use `None` for -# a no-op if you do not wish to receive input characters for that binding. -# -# If the same trigger is assigned to multiple actions, all of them are executed -# in the order they were defined in. -# key_bindings: - #- { key: Paste, action: Paste } - #- { key: Copy, action: Copy } - #- { key: L, mods: Control, action: ClearLogNotice } - #- { key: L, mods: Control, mode: ~Vi|~Search, chars: "\x0c" } - #- { key: PageUp, mods: Shift, mode: ~Alt, action: ScrollPageUp, } - #- { key: PageDown, mods: Shift, mode: ~Alt, action: ScrollPageDown } - #- { key: Home, mods: Shift, mode: ~Alt, action: ScrollToTop, } - #- { key: End, mods: Shift, mode: ~Alt, action: ScrollToBottom } - - # Vi Mode - #- { key: Space, mods: Shift|Control, mode: ~Search, action: ToggleViMode } - #- { key: Space, mods: Shift|Control, mode: Vi|~Search, action: ScrollToBottom } - #- { key: Escape, mode: Vi|~Search, action: ClearSelection } - #- { key: I, mode: Vi|~Search, action: ToggleViMode } - #- { key: I, mode: Vi|~Search, action: ScrollToBottom } - #- { key: C, mods: Control, mode: Vi|~Search, action: ToggleViMode } - #- { key: Y, mods: Control, mode: Vi|~Search, action: ScrollLineUp } - #- { key: E, mods: Control, mode: Vi|~Search, action: ScrollLineDown } - #- { key: G, mode: Vi|~Search, action: ScrollToTop } - #- { key: G, mods: Shift, mode: Vi|~Search, action: ScrollToBottom } - #- { key: B, mods: Control, mode: Vi|~Search, action: ScrollPageUp } - #- { key: F, mods: Control, mode: Vi|~Search, action: ScrollPageDown } - #- { key: U, mods: Control, mode: Vi|~Search, action: ScrollHalfPageUp } - #- { key: D, mods: Control, mode: Vi|~Search, action: ScrollHalfPageDown } - #- { key: Y, mode: Vi|~Search, action: Copy } - #- { key: Y, mode: Vi|~Search, action: ClearSelection } - #- { key: Copy, mode: Vi|~Search, action: ClearSelection } - #- { key: V, mode: Vi|~Search, action: ToggleNormalSelection } - #- { key: V, mods: Shift, mode: Vi|~Search, action: ToggleLineSelection } - #- { key: V, mods: Control, mode: Vi|~Search, action: ToggleBlockSelection } - #- { key: V, mods: Alt, mode: Vi|~Search, action: ToggleSemanticSelection } - #- { key: Return, mode: Vi|~Search, action: Open } - #- { key: K, mode: Vi|~Search, action: Up } - #- { key: J, mode: Vi|~Search, action: Down } - #- { key: H, mode: Vi|~Search, action: Left } - #- { key: L, mode: Vi|~Search, action: Right } - #- { key: Up, mode: Vi|~Search, action: Up } - #- { key: Down, mode: Vi|~Search, action: Down } - #- { key: Left, mode: Vi|~Search, action: Left } - #- { key: Right, mode: Vi|~Search, action: Right } - #- { key: Key0, mode: Vi|~Search, action: First } - #- { key: Key4, mods: Shift, mode: Vi|~Search, action: Last } - #- { key: Key6, mods: Shift, mode: Vi|~Search, action: FirstOccupied } - #- { key: H, mods: Shift, mode: Vi|~Search, action: High } - #- { key: M, mods: Shift, mode: Vi|~Search, action: Middle } - #- { key: L, mods: Shift, mode: Vi|~Search, action: Low } - #- { key: B, mode: Vi|~Search, action: SemanticLeft } - #- { key: W, mode: Vi|~Search, action: SemanticRight } - #- { key: E, mode: Vi|~Search, action: SemanticRightEnd } - #- { key: B, mods: Shift, mode: Vi|~Search, action: WordLeft } - #- { key: W, mods: Shift, mode: Vi|~Search, action: WordRight } - #- { key: E, mods: Shift, mode: Vi|~Search, action: WordRightEnd } - #- { key: Key5, mods: Shift, mode: Vi|~Search, action: Bracket } - #- { key: Slash, mode: Vi|~Search, action: SearchForward } - #- { key: Slash, mods: Shift, mode: Vi|~Search, action: SearchBackward } - #- { key: N, mode: Vi|~Search, action: SearchNext } - #- { key: N, mods: Shift, mode: Vi|~Search, action: SearchPrevious } - - # Search Mode - #- { key: Return, mode: Search|Vi, action: SearchConfirm } - #- { key: Escape, mode: Search, action: SearchCancel } - #- { key: C, mods: Control, mode: Search, action: SearchCancel } - #- { key: U, mods: Control, mode: Search, action: SearchClear } - #- { key: W, mods: Control, mode: Search, action: SearchDeleteWord } - #- { key: P, mods: Control, mode: Search, action: SearchHistoryPrevious } - #- { key: N, mods: Control, mode: Search, action: SearchHistoryNext } - #- { key: Up, mode: Search, action: SearchHistoryPrevious } - #- { key: Down, mode: Search, action: SearchHistoryNext } - #- { key: Return, mode: Search|~Vi, action: SearchFocusNext } - #- { key: Return, mods: Shift, mode: Search|~Vi, action: SearchFocusPrevious } - - # (Windows, Linux, and BSD only) - #- { key: V, mods: Control|Shift, mode: ~Vi, action: Paste } - #- { key: C, mods: Control|Shift, action: Copy } - #- { key: F, mods: Control|Shift, mode: ~Search, action: SearchForward } - #- { key: B, mods: Control|Shift, mode: ~Search, action: SearchBackward } - #- { key: C, mods: Control|Shift, mode: Vi|~Search, action: ClearSelection } - #- { key: Insert, mods: Shift, action: PasteSelection } - #- { key: Key0, mods: Control, action: ResetFontSize } - #- { key: Equals, mods: Control, action: IncreaseFontSize } - #- { key: Plus, mods: Control, action: IncreaseFontSize } - #- { key: NumpadAdd, mods: Control, action: IncreaseFontSize } - #- { key: Minus, mods: Control, action: DecreaseFontSize } - #- { key: NumpadSubtract, mods: Control, action: DecreaseFontSize } - - # (Windows only) - #- { key: Return, mods: Alt, action: ToggleFullscreen } - - # (macOS only) - #- { key: K, mods: Command, mode: ~Vi|~Search, chars: "\x0c" } - #- { key: K, mods: Command, mode: ~Vi|~Search, action: ClearHistory } - #- { key: Key0, mods: Command, action: ResetFontSize } - #- { key: Equals, mods: Command, action: IncreaseFontSize } - #- { key: Plus, mods: Command, action: IncreaseFontSize } - #- { key: NumpadAdd, mods: Command, action: IncreaseFontSize } - #- { key: Minus, mods: Command, action: DecreaseFontSize } - #- { key: NumpadSubtract, mods: Command, action: DecreaseFontSize } - #- { key: V, mods: Command, action: Paste } - #- { key: C, mods: Command, action: Copy } - #- { key: C, mods: Command, mode: Vi|~Search, action: ClearSelection } - #- { key: H, mods: Command, action: Hide } - #- { key: H, mods: Command|Alt, action: HideOtherApplications } - #- { key: M, mods: Command, action: Minimize } - #- { key: Q, mods: Command, action: Quit } - #- { key: W, mods: Command, action: Quit } - #- { key: N, mods: Command, action: SpawnNewInstance } - #- { key: F, mods: Command|Control, action: ToggleFullscreen } - #- { key: F, mods: Command, mode: ~Search, action: SearchForward } - #- { key: B, mods: Command, mode: ~Search, action: SearchBackward } - -#debug: - # Display the time it takes to redraw each frame. - #render_timer: false - - # Keep the log file after quitting Alacritty. - #persistent_logging: false - - # Log level - # - # Values for `log_level`: - # - Off - # - Error - # - Warn - # - Info - # - Debug - # - Trace - #log_level: Warn - - # Print all received window events. - #print_events: false -# Copyright (c) 2017-present Arctic Ice Studio <development@arcticicestudio.com> -# Copyright (c) 2017-present Sven Greb <code@svengreb.de> -# - -################################################################################# -# -# Project: Nord Alacritty -# Version: 0.1.0 -# Repository: https://github.com/arcticicestudio/nord-alacritty -# License: MIT -# References: -# https://github.com/alacritty/alacritty -# -colors: - primary: - background: '#2e3440' - foreground: '#d8dee9' - dim_foreground: '#a5abb6' - cursor: - text: '#2e3440' - cursor: '#d8dee9' - vimode_cursor: - text: '#2e3440' - cursor: '#d8dee9' - selection: - text: CellForeground - background: '#4c566a' - search: - matches: - foreground: CellBackground - background: '#88c0d0' - footer_bar: - background: '#434c5e' - foreground: '#d8dee9' - normal: - black: '#3b4252' - red: '#bf616a' - green: '#a3be8c' - yellow: '#ebcb8b' - blue: '#81a1c1' - magenta: '#b48ead' - cyan: '#88c0d0' - white: '#e5e9f0' - bright: - black: '#6c566a' - green: '#a5abb6' - cyan: '#8fbcbb' - white: '#eceff4' - dim: - black: '#373e4d' - red: '#94545d' - green: '#809575' - yellow: '#b29e75' - blue: '#68809a' - magenta: '#8c738c' - cyan: '#6d96a5' - white: '#aeb3bb' diff --git a/config/X/mpv/input.conf b/config/X/mpv/input.conf deleted file mode 100644 index 9de1b1b..0000000 --- a/config/X/mpv/input.conf +++ /dev/null @@ -1,204 +0,0 @@ -# mpv keybindings -# -# Location of user-defined bindings: ~/.config/mpv/input.conf -# -# Lines starting with # are comments. Use SHARP to assign the # key. -# Copy this file and uncomment and edit the bindings you want to change. -# -# List of commands and further details: DOCS/man/input.rst -# List of special keys: --input-keylist -# Keybindings testing mode: mpv --input-test --force-window --idle -# -# Use 'ignore' to unbind a key fully (e.g. 'ctrl+a ignore'). -# -# Strings need to be quoted and escaped: -# KEY show-text "This is a single backslash: \\ and a quote: \" !" -# -# You can use modifier-key combinations like Shift+Left or Ctrl+Alt+x with -# the modifiers Shift, Ctrl, Alt and Meta (may not work on the terminal). -# -# The default keybindings are hardcoded into the mpv binary. -# You can disable them completely with: --no-input-default-bindings - -# Developer note: -# On compilation, this file is baked into the mpv binary, and all lines are -# uncommented (unless '#' is followed by a space) - thus this file defines the -# default key bindings. - -# If this is enabled, treat all the following bindings as default. -#default-bindings start - -#MBTN_LEFT ignore # don't do anything -#MBTN_LEFT_DBL cycle fullscreen # toggle fullscreen -#MBTN_RIGHT cycle pause # toggle pause/playback mode -#MBTN_BACK playlist-prev # skip to the previous file -#MBTN_FORWARD playlist-next # skip to the next file - -# Mouse wheels, touchpad or other input devices that have axes -# if the input devices supports precise scrolling it will also scale the -# numeric value accordingly -#WHEEL_UP seek 10 # seek 10 seconds forward -#WHEEL_DOWN seek -10 # seek 10 seconds backward -#WHEEL_LEFT add volume -2 -#WHEEL_RIGHT add volume 2 - -## Seek units are in seconds, but note that these are limited by keyframes -#RIGHT seek 5 # seek 5 seconds forward -#LEFT seek -5 # seek 5 seconds backward -#UP seek 60 # seek 1 minute forward -#DOWN seek -60 # seek 1 minute backward -# Do smaller, always exact (non-keyframe-limited), seeks with shift. -# Don't show them on the OSD (no-osd). -#Shift+RIGHT no-osd seek 1 exact # seek exactly 1 second forward -#Shift+LEFT no-osd seek -1 exact # seek exactly 1 second backward -#Shift+UP no-osd seek 5 exact # seek exactly 5 seconds forward -#Shift+DOWN no-osd seek -5 exact # seek exactly 5 seconds backward -#Ctrl+LEFT no-osd sub-seek -1 # seek to the previous subtitle -#Ctrl+RIGHT no-osd sub-seek 1 # seek to the next subtitle -#Ctrl+Shift+LEFT sub-step -1 # change subtitle timing such that the previous subtitle is displayed -#Ctrl+Shift+RIGHT sub-step 1 # change subtitle timing such that the next subtitle is displayed -#Alt+left add video-pan-x 0.1 # move the video right -#Alt+right add video-pan-x -0.1 # move the video left -#Alt+up add video-pan-y 0.1 # move the video down -#Alt+down add video-pan-y -0.1 # move the video up -#Alt++ add video-zoom 0.1 # zoom in -#Alt+- add video-zoom -0.1 # zoom out -#Alt+BS set video-zoom 0 ; set video-pan-x 0 ; set video-pan-y 0 # reset zoom and pan settings -#PGUP add chapter 1 # seek to the next chapter -#PGDWN add chapter -1 # seek to the previous chapter -#Shift+PGUP seek 600 # seek 10 minutes forward -#Shift+PGDWN seek -600 # seek 10 minutes backward -#[ multiply speed 1/1.1 # decrease the playback speed -#] multiply speed 1.1 # increase the playback speed -#{ multiply speed 0.5 # halve the playback speed -#} multiply speed 2.0 # double the playback speed -#BS set speed 1.0 # reset the speed to normal -#Shift+BS revert-seek # undo the previous (or marked) seek -#Shift+Ctrl+BS revert-seek mark # mark the position for revert-seek -#q quit -#Q quit-watch-later # exit and remember the playback position -#q {encode} quit 4 -#ESC set fullscreen no # leave fullscreen -#ESC {encode} quit 4 -#p cycle pause # toggle pause/playback mode -#. frame-step # advance one frame and pause -#, frame-back-step # go back by one frame and pause -#SPACE cycle pause # toggle pause/playback mode -#> playlist-next # skip to the next file -#ENTER playlist-next # skip to the next file -#< playlist-prev # skip to the previous file -#O no-osd cycle-values osd-level 3 1 # toggle displaying the OSD on user interaction or always -#o show-progress # show playback progress -#P show-progress # show playback progress -#i script-binding stats/display-stats # display information and statistics -#I script-binding stats/display-stats-toggle # toggle displaying information and statistics -#` script-binding console/enable # open the console -#z add sub-delay -0.1 # shift subtitles 100 ms earlier -#Z add sub-delay +0.1 # delay subtitles by 100 ms -#x add sub-delay +0.1 # delay subtitles by 100 ms -#ctrl++ add audio-delay 0.100 # change audio/video sync by delaying the audio -#ctrl+- add audio-delay -0.100 # change audio/video sync by shifting the audio earlier -#Shift+g add sub-scale +0.1 # increase the subtitle font size -#Shift+f add sub-scale -0.1 # decrease the subtitle font size -#9 add volume -2 -#/ add volume -2 -#0 add volume 2 -#* add volume 2 -#m cycle mute # toggle mute -#1 add contrast -1 -#2 add contrast 1 -#3 add brightness -1 -#4 add brightness 1 -#5 add gamma -1 -#6 add gamma 1 -#7 add saturation -1 -#8 add saturation 1 -#Alt+0 set current-window-scale 0.5 # halve the window size -#Alt+1 set current-window-scale 1.0 # reset the window size -#Alt+2 set current-window-scale 2.0 # double the window size -#d cycle deinterlace # toggle the deinterlacing filter -#r add sub-pos -1 # move subtitles up -#R add sub-pos +1 # move subtitles down -#t add sub-pos +1 # move subtitles down -#v cycle sub-visibility # hide or show the subtitles -#Alt+v cycle secondary-sub-visibility # hide or show the secondary subtitles -#V cycle sub-ass-vsfilter-aspect-compat # toggle stretching SSA/ASS subtitles with anamorphic videos to match the historical renderer -#u cycle-values sub-ass-override "force" "no" # toggle overriding SSA/ASS subtitle styles with the normal styles -#j cycle sub # switch subtitle track -#J cycle sub down # switch subtitle track backwards -#SHARP cycle audio # switch audio track -#_ cycle video # switch video track -#T cycle ontop # toggle placing the video on top of other windows -#f cycle fullscreen # toggle fullscreen -#s screenshot # take a screenshot of the video in its original resolution with subtitles -#S screenshot video # take a screenshot of the video in its original resolution without subtitles -#Ctrl+s screenshot window # take a screenshot of the window with OSD and subtitles -#Alt+s screenshot each-frame # automatically screenshot every frame; issue this command again to stop taking screenshots -#w add panscan -0.1 # decrease panscan -#W add panscan +0.1 # shrink black bars by cropping the video -#e add panscan +0.1 # shrink black bars by cropping the video -#A cycle-values video-aspect-override "16:9" "4:3" "2.35:1" "-1" # cycle the video aspect ratio ("-1" is the container aspect) -#POWER quit -#PLAY cycle pause # toggle pause/playback mode -#PAUSE cycle pause # toggle pause/playback mode -#PLAYPAUSE cycle pause # toggle pause/playback mode -#PLAYONLY set pause no # unpause -#PAUSEONLY set pause yes # pause -#STOP quit -#FORWARD seek 60 # seek 1 minute forward -#REWIND seek -60 # seek 1 minute backward -#NEXT playlist-next # skip to the next file -#PREV playlist-prev # skip to the previous file -#VOLUME_UP add volume 2 -#VOLUME_DOWN add volume -2 -#MUTE cycle mute # toggle mute -#CLOSE_WIN quit -#CLOSE_WIN {encode} quit 4 -#ctrl+w quit -#E cycle edition # switch edition -#l ab-loop # set/clear A-B loop points -#L cycle-values loop-file "inf" "no" # toggle infinite looping -#ctrl+c quit 4 -#DEL script-binding osc/visibility # cycle OSC visibility between never, auto (mouse-move) and always -#ctrl+h cycle-values hwdec "auto" "no" # toggle hardware decoding -#F8 show-text ${playlist} # show the playlist -#F9 show-text ${track-list} # show the list of video, audio and sub tracks - -# -# Legacy bindings (may or may not be removed in the future) -# -#! add chapter -1 # seek to the previous chapter -#@ add chapter 1 # seek to the next chapter - -# -# Not assigned by default -# (not an exhaustive list of unbound commands) -# - -# ? cycle sub-forced-only # toggle DVD forced subs -# ? stop # stop playback (quit or enter idle mode) -# - -q quit-watch-later - -# seeking -H add chapter -1 -L add chapter 1 -h seek -5 -l seek 5 -- seek -60 -= seek 60 - -# Add/Decrease volume -j add volume -5 -k add volume 5 - -# Subtitles -c cycle sub # switch subtitle track up-order -C cycle sub down # switch subtitle track down-order -Alt+c cycle sub-visibility # Toggle subtitles - -# Cycle audio tracks -v cycle audio # switch audio track -V cycle audio # switch audio track -ctrl+l cycle-values loop-file "inf" "no" # toggle infinite looping diff --git a/config/X/mpv/mpv.conf b/config/X/mpv/mpv.conf deleted file mode 100755 index 4f5e251..0000000 --- a/config/X/mpv/mpv.conf +++ /dev/null @@ -1,28 +0,0 @@ -profile=gpu-hq - -# Set OSD font -osd-font='monospace' -# Set OSD font size -osd-font-size=30 - -# Set volume to 100% on startup. -volume=60 - -# Set player max vol to 100%. -volume-max=100 - -# Set max streaming quality as 1080p. -ytdl-format=bestvideo[height<=?1080]+bestaudio/best - -# Default demuxer is 150/75 MB, note that this uses RAM so set a reasonable amount. -# 150MB, Max pre-load for network streams (1 MiB = 1048576 Bytes). -demuxer-max-bytes=150000000 - -# 75MB, Max loaded video kept after playback. -demuxer-max-back-bytes=75000000 - -# Force stream to be seekable even if disabled. -force-seekable=yes - -slang=eng, en, english -alang=jpn diff --git a/config/X/mpv/scripts/script-opts/webm.conf b/config/X/mpv/scripts/script-opts/webm.conf deleted file mode 100644 index 9ea44dd..0000000 --- a/config/X/mpv/scripts/script-opts/webm.conf +++ /dev/null @@ -1,78 +0,0 @@ -# Defaults to shift+w -keybind=W -# If empty, saves on the same directory of the playing video. -# A starting "~" will be replaced by the home dir. -# This field is delimited by double-square-brackets - [[ and ]] - instead of -# quotes, because Windows users might run into a issue when using -# backslashes as a path separator. Examples of valid inputs for this field -# would be: [[]] (the default, empty value), [[C:\Users\John]] (on Windows), -# and [[/home/john]] (on Unix-like systems eg. Linux). -# The [[]] delimiter is not needed when using from a configuration file -# in the script-opts folder. -output_directory= -run_detached=no -# Template string for the output file -# %f - Filename, with extension -# %F - Filename, without extension -# %T - Media title, if it exists, or filename, with extension (useful for some streams, such as YouTube). -# %s, %e - Start and end time, with milliseconds -# %S, %E - Start and end time, without milliseconds -# %M - "-audio", if audio is enabled, empty otherwise -# %R - "-(height)p", where height is the video's height, or scale_height, if it's enabled. -# More specifiers are supported, see https://mpv.io/manual/master/#options-screenshot-template -# Property expansion is supported (with %{} at top level, ${} when nested), see https://mpv.io/manual/master/#property-expansion -output_template=%F-[%s-%e]%M -# Scale video to a certain height, keeping the aspect ratio. -1 disables it. -scale_height=-1 -# Change the FPS of the output video, dropping or duplicating frames as needed. -# -1 means the FPS will be unchanged from the source. -fps=-1 -# Target filesize, in kB. This will be used to calculate the bitrate -# used on the encode. If this is set to <= 0, the video bitrate will be set -# to 0, which might enable constant quality modes, depending on the -# video codec that's used (VP8 and VP9, for example). -target_filesize=2500 -# If true, will use stricter flags to ensure the resulting file doesn't -# overshoot the target filesize. Not recommended, as constrained quality -# mode should work well, unless you're really having trouble hitting -# the target size. -strict_filesize_constraint=no -strict_bitrate_multiplier=0.95 -# In kilobits. -strict_audio_bitrate=64 -# Sets the output format, from a few predefined ones. -# Currently we have: -# webm-vp8 (libvpx/libvorbis) -# webm-vp9 (libvpx-vp9/libopus) -# mp4 (h264/AAC) -# mp4-nvenc (h264-NVENC/AAC) -# raw (rawvideo/pcm_s16le). -# mp3 (libmp3lame) -# and gif -output_format=webm-vp8 -twopass=yes -# If set, applies the video filters currently used on the playback to the encode. -apply_current_filters=yes -# If set, writes the video's filename to the "Title" field on the metadata. -write_filename_on_metadata=no -# Set the number of encoding threads, for codecs libvpx and libvpx-vp9 -libvpx_threads=4 -additional_flags= -# Constant Rate Factor (CRF). The value meaning and limits may change, -# from codec to codec. Set to -1 to disable. -crf=10 -# Useful for flags that may impact output filesize, such as qmin, qmax etc -# Won't be applied when strict_filesize_constraint is on. -non_strict_additional_flags= -# Display the encode progress, in %. Requires run_detached to be disabled. -# On Windows, it shows a cmd popup. "auto" will display progress on non-Windows platforms. -display_progress=auto -# The font size used in the menu. Isn't used for the notifications (started encode, finished encode etc) -font_size=28 -margin=10 -message_duration=5 -# gif dither mode, 0-5 for bayer w/ bayer_scale 0-5, 6 for paletteuse default (sierra2_4a) -gif_dither=2 -# Force square pixels on output video -# Some players like recent Firefox versions display videos with non-square pixels with wrong aspect ratio -force_square_pixels=no diff --git a/config/X/mpv/scripts/script-opts/youtube-quality.conf b/config/X/mpv/scripts/script-opts/youtube-quality.conf deleted file mode 100755 index fc1361b..0000000 --- a/config/X/mpv/scripts/script-opts/youtube-quality.conf +++ /dev/null @@ -1,41 +0,0 @@ -# KEY BINDINGS - -# invoke or dismiss the quality menu -toggle_menu_binding=ctrl+f -# move the menu cursor up -up_binding=UP -# move the menu cursor down -down_binding=DOWN -# select menu entry -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=1 -text_padding_y=1 - -# how many seconds until the quality menu times out -menu_timeout=10 - -#use youtube-dl to fetch a list of available formats (overrides quality_strings) -fetch_formats=yes - -# list of ytdl-format strings to choose from -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"} ] diff --git a/config/X/mpv/scripts/webm.lua b/config/X/mpv/scripts/webm.lua deleted file mode 100644 index 4397b9b..0000000 --- a/config/X/mpv/scripts/webm.lua +++ /dev/null @@ -1,2914 +0,0 @@ -local mp = require("mp") -local assdraw = require("mp.assdraw") -local msg = require("mp.msg") -local utils = require("mp.utils") -local mpopts = require("mp.options") -local options = { - -- Defaults to shift+w - keybind = "W", - -- If empty, saves on the same directory of the playing video. - -- A starting "~" will be replaced by the home dir. - -- This field is delimited by double-square-brackets - [[ and ]] - instead of - -- quotes, because Windows users might run into a issue when using - -- backslashes as a path separator. Examples of valid inputs for this field - -- would be: [[]] (the default, empty value), [[C:\Users\John]] (on Windows), - -- and [[/home/john]] (on Unix-like systems eg. Linux). - -- The [[]] delimiter is not needed when using from a configuration file - -- in the script-opts folder. - output_directory = [[]], - run_detached = false, - -- Template string for the output file - -- %f - Filename, with extension - -- %F - Filename, without extension - -- %T - Media title, if it exists, or filename, with extension (useful for some streams, such as YouTube). - -- %s, %e - Start and end time, with milliseconds - -- %S, %E - Start and end time, without milliseconds - -- %M - "-audio", if audio is enabled, empty otherwise - -- %R - "-(height)p", where height is the video's height, or scale_height, if it's enabled. - -- More specifiers are supported, see https://mpv.io/manual/master/#options-screenshot-template - -- Property expansion is supported (with %{} at top level, ${} when nested), see https://mpv.io/manual/master/#property-expansion - output_template = "%F-[%s-%e]%M", - -- Scale video to a certain height, keeping the aspect ratio. -1 disables it. - scale_height = -1, - -- Change the FPS of the output video, dropping or duplicating frames as needed. - -- -1 means the FPS will be unchanged from the source. - fps = -1, - -- Target filesize, in kB. This will be used to calculate the bitrate - -- used on the encode. If this is set to <= 0, the video bitrate will be set - -- to 0, which might enable constant quality modes, depending on the - -- video codec that's used (VP8 and VP9, for example). - target_filesize = 2500, - -- If true, will use stricter flags to ensure the resulting file doesn't - -- overshoot the target filesize. Not recommended, as constrained quality - -- mode should work well, unless you're really having trouble hitting - -- the target size. - strict_filesize_constraint = false, - strict_bitrate_multiplier = 0.95, - -- In kilobits. - strict_audio_bitrate = 64, - -- Sets the output format, from a few predefined ones. - -- Currently we have: - -- webm-vp8 (libvpx/libvorbis) - -- webm-vp9 (libvpx-vp9/libopus) - -- mp4 (h264/AAC) - -- mp4-nvenc (h264-NVENC/AAC) - -- raw (rawvideo/pcm_s16le). - -- mp3 (libmp3lame) - -- and gif - output_format = "webm-vp8", - twopass = true, - -- If set, applies the video filters currently used on the playback to the encode. - apply_current_filters = true, - -- If set, writes the video's filename to the "Title" field on the metadata. - write_filename_on_metadata = false, - -- Set the number of encoding threads, for codecs libvpx and libvpx-vp9 - libvpx_threads = 4, - additional_flags = "", - -- Constant Rate Factor (CRF). The value meaning and limits may change, - -- from codec to codec. Set to -1 to disable. - crf = 10, - -- Useful for flags that may impact output filesize, such as qmin, qmax etc - -- Won't be applied when strict_filesize_constraint is on. - non_strict_additional_flags = "", - -- Display the encode progress, in %. Requires run_detached to be disabled. - -- On Windows, it shows a cmd popup. "auto" will display progress on non-Windows platforms. - display_progress = "auto", - -- The font size used in the menu. Isn't used for the notifications (started encode, finished encode etc) - font_size = 28, - margin = 10, - message_duration = 5, - -- gif dither mode, 0-5 for bayer w/ bayer_scale 0-5, 6 for paletteuse default (sierra2_4a) - gif_dither = 2, - -- Force square pixels on output video - -- Some players like recent Firefox versions display videos with non-square pixels with wrong aspect ratio - force_square_pixels = false, -} - -mpopts.read_options(options) -local base64_chars='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' - --- encoding -function base64_encode(data) - return ((data:gsub('.', function(x) - local r,b='',x:byte() - for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end - return r; - end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) - if (#x < 6) then return '' end - local c=0 - for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end - return base64_chars:sub(c+1,c+1) - end)..({ '', '==', '=' })[#data%3+1]) -end - --- decoding -function base64_decode(data) - data = string.gsub(data, '[^'..base64_chars..'=]', '') - return (data:gsub('.', function(x) - if (x == '=') then return '' end - local r,f='',(base64_chars:find(x)-1) - for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)>0 and '1' or '0') end - return r; - end):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x) - if (#x ~= 8) then return '' end - local c=0 - for i=1,8 do c=c+(x:sub(i,i)=='1' and 2^(8-i) or 0) end - return string.char(c) - end)) -end -local emit_event -emit_event = function(event_name, ...) - return mp.commandv("script-message", "webm-" .. tostring(event_name), ...) -end -local test_set_options -test_set_options = function(new_options_json) - local new_options = utils.parse_json(new_options_json) - for k, v in pairs(new_options) do - options[k] = v - end -end -mp.register_script_message("mpv-webm-set-options", test_set_options) -local bold -bold = function(text) - return "{\\b1}" .. tostring(text) .. "{\\b0}" -end -local message -message = function(text, duration) - local ass = mp.get_property_osd("osd-ass-cc/0") - ass = ass .. text - return mp.osd_message(ass, duration or options.message_duration) -end -local append -append = function(a, b) - for _, val in ipairs(b) do - a[#a + 1] = val - end - return a -end -local seconds_to_time_string -seconds_to_time_string = function(seconds, no_ms, full) - if seconds < 0 then - return "unknown" - end - local ret = "" - if not (no_ms) then - ret = string.format(".%03d", seconds * 1000 % 1000) - end - ret = string.format("%02d:%02d%s", math.floor(seconds / 60) % 60, math.floor(seconds) % 60, ret) - if full or seconds > 3600 then - ret = string.format("%d:%s", math.floor(seconds / 3600), ret) - end - return ret -end -local seconds_to_path_element -seconds_to_path_element = function(seconds, no_ms, full) - local time_string = seconds_to_time_string(seconds, no_ms, full) - local _ - time_string, _ = time_string:gsub(":", ".") - return time_string -end -local file_exists -file_exists = function(name) - local info, err = utils.file_info(name) - if info ~= nil then - return true - end - return false -end -local expand_properties -expand_properties = function(text, magic) - if magic == nil then - magic = "$" - end - for prefix, raw, prop, colon, fallback, closing in text:gmatch("%" .. magic .. "{([?!]?)(=?)([^}:]*)(:?)([^}]*)(}*)}") do - local err - local prop_value - local compare_value - local original_prop = prop - local get_property = mp.get_property_osd - if raw == "=" then - get_property = mp.get_property - end - if prefix ~= "" then - for actual_prop, compare in prop:gmatch("(.-)==(.*)") do - prop = actual_prop - compare_value = compare - end - end - if colon == ":" then - prop_value, err = get_property(prop, fallback) - else - prop_value, err = get_property(prop, "(error)") - end - prop_value = tostring(prop_value) - if prefix == "?" then - if compare_value == nil then - prop_value = err == nil and fallback .. closing or "" - else - prop_value = prop_value == compare_value and fallback .. closing or "" - end - prefix = "%" .. prefix - elseif prefix == "!" then - if compare_value == nil then - prop_value = err ~= nil and fallback .. closing or "" - else - prop_value = prop_value ~= compare_value and fallback .. closing or "" - end - else - prop_value = prop_value .. closing - end - if colon == ":" then - local _ - text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. ":" .. fallback:gsub("%W", "%%%1") .. closing .. "}", expand_properties(prop_value)) - else - local _ - text, _ = text:gsub("%" .. magic .. "{" .. prefix .. raw .. original_prop:gsub("%W", "%%%1") .. closing .. "}", prop_value) - end - end - return text -end -local format_filename -format_filename = function(startTime, endTime, videoFormat) - local hasAudioCodec = videoFormat.audioCodec ~= "" - local replaceFirst = { - ["%%mp"] = "%%mH.%%mM.%%mS", - ["%%mP"] = "%%mH.%%mM.%%mS.%%mT", - ["%%p"] = "%%wH.%%wM.%%wS", - ["%%P"] = "%%wH.%%wM.%%wS.%%wT" - } - local replaceTable = { - ["%%wH"] = string.format("%02d", math.floor(startTime / (60 * 60))), - ["%%wh"] = string.format("%d", math.floor(startTime / (60 * 60))), - ["%%wM"] = string.format("%02d", math.floor(startTime / 60 % 60)), - ["%%wm"] = string.format("%d", math.floor(startTime / 60)), - ["%%wS"] = string.format("%02d", math.floor(startTime % 60)), - ["%%ws"] = string.format("%d", math.floor(startTime)), - ["%%wf"] = string.format("%s", startTime), - ["%%wT"] = string.sub(string.format("%.3f", startTime % 1), 3), - ["%%mH"] = string.format("%02d", math.floor(endTime / (60 * 60))), - ["%%mh"] = string.format("%d", math.floor(endTime / (60 * 60))), - ["%%mM"] = string.format("%02d", math.floor(endTime / 60 % 60)), - ["%%mm"] = string.format("%d", math.floor(endTime / 60)), - ["%%mS"] = string.format("%02d", math.floor(endTime % 60)), - ["%%ms"] = string.format("%d", math.floor(endTime)), - ["%%mf"] = string.format("%s", endTime), - ["%%mT"] = string.sub(string.format("%.3f", endTime % 1), 3), - ["%%f"] = mp.get_property("filename"), - ["%%F"] = mp.get_property("filename/no-ext"), - ["%%s"] = seconds_to_path_element(startTime), - ["%%S"] = seconds_to_path_element(startTime, true), - ["%%e"] = seconds_to_path_element(endTime), - ["%%E"] = seconds_to_path_element(endTime, true), - ["%%T"] = mp.get_property("media-title"), - ["%%M"] = (mp.get_property_native('aid') and not mp.get_property_native('mute') and hasAudioCodec) and '-audio' or '', - ["%%R"] = (options.scale_height ~= -1) and "-" .. tostring(options.scale_height) .. "p" or "-" .. tostring(mp.get_property_native('height')) .. "p", - ["%%t%%"] = "%%" - } - local filename = options.output_template - for format, value in pairs(replaceFirst) do - local _ - filename, _ = filename:gsub(format, value) - end - for format, value in pairs(replaceTable) do - local _ - filename, _ = filename:gsub(format, value) - end - if mp.get_property_bool("demuxer-via-network", false) then - local _ - filename, _ = filename:gsub("%%X{([^}]*)}", "%1") - filename, _ = filename:gsub("%%x", "") - else - local x = string.gsub(mp.get_property("stream-open-filename", ""), string.gsub(mp.get_property("filename", ""), "%W", "%%%1") .. "$", "") - local _ - filename, _ = filename:gsub("%%X{[^}]*}", x) - filename, _ = filename:gsub("%%x", x) - end - filename = expand_properties(filename, "%") - for format in filename:gmatch("%%t([aAbBcCdDeFgGhHIjmMnprRStTuUVwWxXyYzZ])") do - local _ - filename, _ = filename:gsub("%%t" .. format, os.date("%" .. format)) - end - local _ - filename, _ = filename:gsub("[<>:\"/\\|?*]", "") - return tostring(filename) .. "." .. tostring(videoFormat.outputExtension) -end -local parse_directory -parse_directory = function(dir) - local home_dir = os.getenv("HOME") - if not home_dir then - home_dir = os.getenv("USERPROFILE") - end - if not home_dir then - local drive = os.getenv("HOMEDRIVE") - local path = os.getenv("HOMEPATH") - if drive and path then - home_dir = utils.join_path(drive, path) - else - msg.warn("Couldn't find home dir.") - home_dir = "" - end - end - local _ - dir, _ = dir:gsub("^~", home_dir) - return dir -end -local is_windows = type(package) == "table" and type(package.config) == "string" and package.config:sub(1, 1) == "\\" -local trim -trim = function(s) - return s:match("^%s*(.-)%s*$") -end -local get_null_path -get_null_path = function() - if file_exists("/dev/null") then - return "/dev/null" - end - return "NUL" -end -local run_subprocess -run_subprocess = function(params) - local res = utils.subprocess(params) - msg.verbose("Command stdout: ") - msg.verbose(res.stdout) - if res.status ~= 0 then - msg.verbose("Command failed! Reason: ", res.error, " Killed by us? ", res.killed_by_us and "yes" or "no") - return false - end - return true -end -local shell_escape -shell_escape = function(args) - local ret = { } - for i, a in ipairs(args) do - local s = tostring(a) - if string.match(s, "[^A-Za-z0-9_/:=-]") then - if is_windows then - s = '"' .. string.gsub(s, '"', '"\\""') .. '"' - else - s = "'" .. string.gsub(s, "'", "'\\''") .. "'" - end - end - table.insert(ret, s) - end - local concat = table.concat(ret, " ") - if is_windows then - concat = '"' .. concat .. '"' - end - return concat -end -local run_subprocess_popen -run_subprocess_popen = function(command_line) - local command_line_string = shell_escape(command_line) - command_line_string = command_line_string .. " 2>&1" - msg.verbose("run_subprocess_popen: running " .. tostring(command_line_string)) - return io.popen(command_line_string) -end -local calculate_scale_factor -calculate_scale_factor = function() - local baseResY = 720 - local osd_w, osd_h = mp.get_osd_size() - return osd_h / baseResY -end -local should_display_progress -should_display_progress = function() - if options.display_progress == "auto" then - return not is_windows - end - return options.display_progress -end -local reverse -reverse = function(list) - local _accum_0 = { } - local _len_0 = 1 - local _max_0 = 1 - for _index_0 = #list, _max_0 < 0 and #list + _max_0 or _max_0, -1 do - local element = list[_index_0] - _accum_0[_len_0] = element - _len_0 = _len_0 + 1 - end - return _accum_0 -end -local get_pass_logfile_path -get_pass_logfile_path = function(encode_out_path) - return tostring(encode_out_path) .. "-video-pass1.log" -end -local dimensions_changed = true -local _video_dimensions = { } -local get_video_dimensions -get_video_dimensions = function() - if not (dimensions_changed) then - return _video_dimensions - end - local video_params = mp.get_property_native("video-out-params") - if not video_params then - return nil - end - dimensions_changed = false - local keep_aspect = mp.get_property_bool("keepaspect") - local w = video_params["w"] - local h = video_params["h"] - local dw = video_params["dw"] - local dh = video_params["dh"] - if mp.get_property_number("video-rotate") % 180 == 90 then - w, h = h, w - dw, dh = dh, dw - end - _video_dimensions = { - top_left = { }, - bottom_right = { }, - ratios = { } - } - local window_w, window_h = mp.get_osd_size() - if keep_aspect then - local unscaled = mp.get_property_native("video-unscaled") - local panscan = mp.get_property_number("panscan") - local fwidth = window_w - local fheight = math.floor(window_w / dw * dh) - if fheight > window_h or fheight < h then - local tmpw = math.floor(window_h / dh * dw) - if tmpw <= window_w then - fheight = window_h - fwidth = tmpw - end - end - local vo_panscan_area = window_h - fheight - local f_w = fwidth / fheight - local f_h = 1 - if vo_panscan_area == 0 then - vo_panscan_area = window_h - fwidth - f_w = 1 - f_h = fheight / fwidth - end - if unscaled or unscaled == "downscale-big" then - vo_panscan_area = 0 - if unscaled or (dw <= window_w and dh <= window_h) then - fwidth = dw - fheight = dh - end - end - local scaled_width = fwidth + math.floor(vo_panscan_area * panscan * f_w) - local scaled_height = fheight + math.floor(vo_panscan_area * panscan * f_h) - local split_scaling - split_scaling = function(dst_size, scaled_src_size, zoom, align, pan) - scaled_src_size = math.floor(scaled_src_size * 2 ^ zoom) - align = (align + 1) / 2 - local dst_start = math.floor((dst_size - scaled_src_size) * align + pan * scaled_src_size) - if dst_start < 0 then - dst_start = dst_start + 1 - end - local dst_end = dst_start + scaled_src_size - if dst_start >= dst_end then - dst_start = 0 - dst_end = 1 - end - return dst_start, dst_end - end - local zoom = mp.get_property_number("video-zoom") - local align_x = mp.get_property_number("video-align-x") - local pan_x = mp.get_property_number("video-pan-x") - _video_dimensions.top_left.x, _video_dimensions.bottom_right.x = split_scaling(window_w, scaled_width, zoom, align_x, pan_x) - local align_y = mp.get_property_number("video-align-y") - local pan_y = mp.get_property_number("video-pan-y") - _video_dimensions.top_left.y, _video_dimensions.bottom_right.y = split_scaling(window_h, scaled_height, zoom, align_y, pan_y) - else - _video_dimensions.top_left.x = 0 - _video_dimensions.bottom_right.x = window_w - _video_dimensions.top_left.y = 0 - _video_dimensions.bottom_right.y = window_h - end - _video_dimensions.ratios.w = w / (_video_dimensions.bottom_right.x - _video_dimensions.top_left.x) - _video_dimensions.ratios.h = h / (_video_dimensions.bottom_right.y - _video_dimensions.top_left.y) - return _video_dimensions -end -local set_dimensions_changed -set_dimensions_changed = function() - dimensions_changed = true -end -local monitor_dimensions -monitor_dimensions = function() - local properties = { - "keepaspect", - "video-out-params", - "video-unscaled", - "panscan", - "video-zoom", - "video-align-x", - "video-pan-x", - "video-align-y", - "video-pan-y", - "osd-width", - "osd-height" - } - for _, p in ipairs(properties) do - mp.observe_property(p, "native", set_dimensions_changed) - end -end -local clamp -clamp = function(min, val, max) - if val <= min then - return min - end - if val >= max then - return max - end - return val -end -local clamp_point -clamp_point = function(top_left, point, bottom_right) - return { - x = clamp(top_left.x, point.x, bottom_right.x), - y = clamp(top_left.y, point.y, bottom_right.y) - } -end -local VideoPoint -do - local _class_0 - local _base_0 = { - set_from_screen = function(self, sx, sy) - local d = get_video_dimensions() - local point = clamp_point(d.top_left, { - x = sx, - y = sy - }, d.bottom_right) - self.x = math.floor(d.ratios.w * (point.x - d.top_left.x) + 0.5) - self.y = math.floor(d.ratios.h * (point.y - d.top_left.y) + 0.5) - end, - to_screen = function(self) - local d = get_video_dimensions() - return { - x = math.floor(self.x / d.ratios.w + d.top_left.x + 0.5), - y = math.floor(self.y / d.ratios.h + d.top_left.y + 0.5) - } - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - self.x = -1 - self.y = -1 - end, - __base = _base_0, - __name = "VideoPoint" - }, { - __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 - VideoPoint = _class_0 -end -local Region -do - local _class_0 - local _base_0 = { - is_valid = function(self) - return self.x > -1 and self.y > -1 and self.w > -1 and self.h > -1 - end, - set_from_points = function(self, p1, p2) - self.x = math.min(p1.x, p2.x) - self.y = math.min(p1.y, p2.y) - self.w = math.abs(p1.x - p2.x) - self.h = math.abs(p1.y - p2.y) - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - self.x = -1 - self.y = -1 - self.w = -1 - self.h = -1 - end, - __base = _base_0, - __name = "Region" - }, { - __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 - Region = _class_0 -end -local make_fullscreen_region -make_fullscreen_region = function() - local r = Region() - local d = get_video_dimensions() - local a = VideoPoint() - local b = VideoPoint() - local xa, ya - do - local _obj_0 = d.top_left - xa, ya = _obj_0.x, _obj_0.y - end - a:set_from_screen(xa, ya) - local xb, yb - do - local _obj_0 = d.bottom_right - xb, yb = _obj_0.x, _obj_0.y - end - b:set_from_screen(xb, yb) - r:set_from_points(a, b) - return r -end -local read_double -read_double = function(bytes) - local sign = 1 - local mantissa = bytes[2] % 2 ^ 4 - for i = 3, 8 do - mantissa = mantissa * 256 + bytes[i] - end - if bytes[1] > 127 then - sign = -1 - end - local exponent = (bytes[1] % 128) * 2 ^ 4 + math.floor(bytes[2] / 2 ^ 4) - if exponent == 0 then - return 0 - end - mantissa = (math.ldexp(mantissa, -52) + 1) * sign - return math.ldexp(mantissa, exponent - 1023) -end -local write_double -write_double = function(num) - local bytes = { - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0 - } - if num == 0 then - return bytes - end - local anum = math.abs(num) - local mantissa, exponent = math.frexp(anum) - exponent = exponent - 1 - mantissa = mantissa * 2 - 1 - local sign = num ~= anum and 128 or 0 - exponent = exponent + 1023 - bytes[1] = sign + math.floor(exponent / 2 ^ 4) - mantissa = mantissa * 2 ^ 4 - local currentmantissa = math.floor(mantissa) - mantissa = mantissa - currentmantissa - bytes[2] = (exponent % 2 ^ 4) * 2 ^ 4 + currentmantissa - for i = 3, 8 do - mantissa = mantissa * 2 ^ 8 - currentmantissa = math.floor(mantissa) - mantissa = mantissa - currentmantissa - bytes[i] = currentmantissa - end - return bytes -end -local FirstpassStats -do - local _class_0 - local duration_multiplier, fields_before_duration, fields_after_duration - local _base_0 = { - get_duration = function(self) - local big_endian_binary_duration = reverse(self.binary_duration) - return read_double(reversed_binary_duration) / duration_multiplier - end, - set_duration = function(self, duration) - local big_endian_binary_duration = write_double(duration * duration_multiplier) - self.binary_duration = reverse(big_endian_binary_duration) - end, - _bytes_to_string = function(self, bytes) - return string.char(unpack(bytes)) - end, - as_binary_string = function(self) - local before_duration_string = self:_bytes_to_string(self.binary_data_before_duration) - local duration_string = self:_bytes_to_string(self.binary_duration) - local after_duration_string = self:_bytes_to_string(self.binary_data_after_duration) - return before_duration_string .. duration_string .. after_duration_string - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, before_duration, duration, after_duration) - self.binary_data_before_duration = before_duration - self.binary_duration = duration - self.binary_data_after_duration = after_duration - end, - __base = _base_0, - __name = "FirstpassStats" - }, { - __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 - local self = _class_0 - duration_multiplier = 10000000.0 - fields_before_duration = 16 - fields_after_duration = 1 - self.data_before_duration_size = function(self) - return fields_before_duration * 8 - end - self.data_after_duration_size = function(self) - return fields_after_duration * 8 - end - self.size = function(self) - return (fields_before_duration + 1 + fields_after_duration) * 8 - end - self.from_bytes = function(self, bytes) - local before_duration - do - local _accum_0 = { } - local _len_0 = 1 - local _max_0 = self:data_before_duration_size() - for _index_0 = 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do - local b = bytes[_index_0] - _accum_0[_len_0] = b - _len_0 = _len_0 + 1 - end - before_duration = _accum_0 - end - local duration - do - local _accum_0 = { } - local _len_0 = 1 - local _max_0 = self:data_before_duration_size() + 8 - for _index_0 = self:data_before_duration_size() + 1, _max_0 < 0 and #bytes + _max_0 or _max_0 do - local b = bytes[_index_0] - _accum_0[_len_0] = b - _len_0 = _len_0 + 1 - end - duration = _accum_0 - end - local after_duration - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = self:data_before_duration_size() + 8 + 1, #bytes do - local b = bytes[_index_0] - _accum_0[_len_0] = b - _len_0 = _len_0 + 1 - end - after_duration = _accum_0 - end - return self(before_duration, duration, after_duration) - end - FirstpassStats = _class_0 -end -local read_logfile_into_stats_array -read_logfile_into_stats_array = function(logfile_path) - local file = assert(io.open(logfile_path, "rb")) - local logfile_string = base64_decode(file:read()) - file:close() - local stats_size = FirstpassStats:size() - assert(logfile_string:len() % stats_size == 0) - local stats = { } - for offset = 1, #logfile_string, stats_size do - local bytes = { - logfile_string:byte(offset, offset + stats_size - 1) - } - assert(#bytes == stats_size) - stats[#stats + 1] = FirstpassStats:from_bytes(bytes) - end - return stats -end -local write_stats_array_to_logfile -write_stats_array_to_logfile = function(stats_array, logfile_path) - local file = assert(io.open(logfile_path, "wb")) - local logfile_string = "" - for _index_0 = 1, #stats_array do - local stat = stats_array[_index_0] - logfile_string = logfile_string .. stat:as_binary_string() - end - file:write(base64_encode(logfile_string)) - return file:close() -end -local vp8_patch_logfile -vp8_patch_logfile = function(logfile_path, encode_total_duration) - local stats_array = read_logfile_into_stats_array(logfile_path) - local average_duration = encode_total_duration / (#stats_array - 1) - for i = 1, #stats_array - 1 do - stats_array[i]:set_duration(average_duration) - end - stats_array[#stats_array]:set_duration(encode_total_duration) - return write_stats_array_to_logfile(stats_array, logfile_path) -end -local formats = { } -local Format -do - local _class_0 - local _base_0 = { - getPreFilters = function(self) - return { } - end, - getPostFilters = function(self) - return { } - end, - getFlags = function(self) - return { } - end, - getCodecFlags = function(self) - local codecs = { } - if self.videoCodec ~= "" then - codecs[#codecs + 1] = "--ovc=" .. tostring(self.videoCodec) - end - if self.audioCodec ~= "" then - codecs[#codecs + 1] = "--oac=" .. tostring(self.audioCodec) - end - return codecs - end, - postCommandModifier = function(self, command, region, startTime, endTime) - return command - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "Basic" - self.supportsTwopass = true - self.videoCodec = "" - self.audioCodec = "" - self.outputExtension = "" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "Format" - }, { - __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 - Format = _class_0 -end -local RawVideo -do - local _class_0 - local _parent_0 = Format - local _base_0 = { - getColorspace = function(self) - local csp = mp.get_property("colormatrix") - local _exp_0 = csp - if "bt.601" == _exp_0 then - return "bt601" - elseif "bt.709" == _exp_0 then - return "bt709" - elseif "bt.2020" == _exp_0 then - return "bt2020" - elseif "smpte-240m" == _exp_0 then - return "smpte240m" - else - msg.info("Warning, unknown colorspace " .. tostring(csp) .. " detected, using bt.601.") - return "bt601" - end - end, - getPostFilters = function(self) - return { - "format=yuv444p16", - "lavfi-scale=in_color_matrix=" .. self:getColorspace(), - "format=bgr24" - } - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "Raw" - self.supportsTwopass = false - self.videoCodec = "rawvideo" - self.audioCodec = "pcm_s16le" - self.outputExtension = "avi" - self.acceptsBitrate = false - end, - __base = _base_0, - __name = "RawVideo", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - RawVideo = _class_0 -end -formats["raw"] = RawVideo() -local WebmVP8 -do - local _class_0 - local _parent_0 = Format - local _base_0 = { - getPreFilters = function(self) - local colormatrixFilter = { - ["bt.709"] = "bt709", - ["bt.2020"] = "bt2020", - ["smpte-240m"] = "smpte240m" - } - local ret = { } - local colormatrix = mp.get_property_native("video-params/colormatrix") - if colormatrixFilter[colormatrix] then - append(ret, { - "lavfi-colormatrix=" .. tostring(colormatrixFilter[colormatrix]) .. ":bt601" - }) - end - return ret - end, - getFlags = function(self) - return { - "--ovcopts-add=threads=" .. tostring(options.libvpx_threads), - "--ovcopts-add=auto-alt-ref=1", - "--ovcopts-add=lag-in-frames=25", - "--ovcopts-add=quality=good", - "--ovcopts-add=cpu-used=0" - } - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "WebM" - self.supportsTwopass = true - self.videoCodec = "libvpx" - self.audioCodec = "libvorbis" - self.outputExtension = "webm" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "WebmVP8", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - WebmVP8 = _class_0 -end -formats["webm-vp8"] = WebmVP8() -local WebmVP9 -do - local _class_0 - local _parent_0 = Format - local _base_0 = { - getFlags = function(self) - return { - "--ovcopts-add=threads=" .. tostring(options.libvpx_threads) - } - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "WebM (VP9)" - self.supportsTwopass = false - self.videoCodec = "libvpx-vp9" - self.audioCodec = "libopus" - self.outputExtension = "webm" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "WebmVP9", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - WebmVP9 = _class_0 -end -formats["webm-vp9"] = WebmVP9() -local MP4 -do - local _class_0 - local _parent_0 = Format - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "MP4 (h264/AAC)" - self.supportsTwopass = true - self.videoCodec = "libx264" - self.audioCodec = "aac" - self.outputExtension = "mp4" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "MP4", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - MP4 = _class_0 -end -formats["mp4"] = MP4() -local MP4NVENC -do - local _class_0 - local _parent_0 = Format - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "MP4 (h264-NVENC/AAC)" - self.supportsTwopass = true - self.videoCodec = "h264_nvenc" - self.audioCodec = "aac" - self.outputExtension = "mp4" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "MP4NVENC", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - MP4NVENC = _class_0 -end -formats["mp4-nvenc"] = MP4NVENC() -local MP3 -do - local _class_0 - local _parent_0 = Format - local _base_0 = { } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "MP3 (libmp3lame)" - self.supportsTwopass = false - self.videoCodec = "" - self.audioCodec = "libmp3lame" - self.outputExtension = "mp3" - self.acceptsBitrate = true - end, - __base = _base_0, - __name = "MP3", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - MP3 = _class_0 -end -formats["mp3"] = MP3() -local GIF -do - local _class_0 - local _parent_0 = Format - local _base_0 = { - postCommandModifier = function(self, command, region, startTime, endTime) - local new_command = { } - local start_ts = seconds_to_time_string(startTime, false, true) - local end_ts = seconds_to_time_string(endTime, false, true) - start_ts = start_ts:gsub(":", "\\\\:") - end_ts = end_ts:gsub(":", "\\\\:") - local cfilter = "[vid1]trim=start=" .. tostring(start_ts) .. ":end=" .. tostring(end_ts) .. "[vidtmp];" - if mp.get_property("deinterlace") == "yes" then - cfilter = cfilter .. "[vidtmp]yadif=mode=1[vidtmp];" - end - for _, v in ipairs(command) do - local _continue_0 = false - repeat - if v:match("^%-%-vf%-add=lavfi%-scale") or v:match("^%-%-vf%-add=lavfi%-crop") or v:match("^%-%-vf%-add=fps") or v:match("^%-%-vf%-add=lavfi%-eq") then - local n = v:gsub("^%-%-vf%-add=", ""):gsub("^lavfi%-", "") - cfilter = cfilter .. "[vidtmp]" .. tostring(n) .. "[vidtmp];" - else - if v:match("^%-%-video%-rotate=90") then - cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];" - else - if v:match("^%-%-video%-rotate=270") then - cfilter = cfilter .. "[vidtmp]transpose=2[vidtmp];" - else - if v:match("^%-%-video%-rotate=180") then - cfilter = cfilter .. "[vidtmp]transpose=1[vidtmp];[vidtmp]transpose=1[vidtmp];" - else - if v:match("^%-%-deinterlace=") then - _continue_0 = true - break - else - append(new_command, { - v - }) - _continue_0 = true - break - end - end - end - end - end - _continue_0 = true - until true - if not _continue_0 then - break - end - end - cfilter = cfilter .. "[vidtmp]split[topal][vidf];" - cfilter = cfilter .. "[topal]palettegen[pal];" - cfilter = cfilter .. "[vidf]fifo[vidf];" - if options.gif_dither == 6 then - cfilter = cfilter .. "[vidf][pal]paletteuse[vo]" - else - cfilter = cfilter .. "[vidf][pal]paletteuse=dither=bayer:bayer_scale=" .. tostring(options.gif_dither) .. ":diff_mode=rectangle[vo]" - end - append(new_command, { - "--lavfi-complex=" .. tostring(cfilter) - }) - return new_command - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.displayName = "GIF" - self.supportsTwopass = false - self.videoCodec = "gif" - self.audioCodec = "" - self.outputExtension = "gif" - self.acceptsBitrate = false - end, - __base = _base_0, - __name = "GIF", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - GIF = _class_0 -end -formats["gif"] = GIF() -local Page -do - local _class_0 - local _base_0 = { - add_keybinds = function(self) - if not self.keybinds then - return - end - for key, func in pairs(self.keybinds) do - mp.add_forced_key_binding(key, key, func, { - repeatable = true - }) - end - end, - remove_keybinds = function(self) - if not self.keybinds then - return - end - for key, _ in pairs(self.keybinds) do - mp.remove_key_binding(key) - end - end, - observe_properties = function(self) - self.sizeCallback = function() - return self:draw() - end - local properties = { - "keepaspect", - "video-out-params", - "video-unscaled", - "panscan", - "video-zoom", - "video-align-x", - "video-pan-x", - "video-align-y", - "video-pan-y", - "osd-width", - "osd-height" - } - for _index_0 = 1, #properties do - local p = properties[_index_0] - mp.observe_property(p, "native", self.sizeCallback) - end - end, - unobserve_properties = function(self) - if self.sizeCallback then - mp.unobserve_property(self.sizeCallback) - self.sizeCallback = nil - end - end, - clear = function(self) - local window_w, window_h = mp.get_osd_size() - mp.set_osd_ass(window_w, window_h, "") - return mp.osd_message("", 0) - end, - prepare = function(self) - return nil - end, - dispose = function(self) - return nil - end, - show = function(self) - if self.visible then - return - end - self.visible = true - self:observe_properties() - self:add_keybinds() - self:prepare() - self:clear() - return self:draw() - end, - hide = function(self) - if not self.visible then - return - end - self.visible = false - self:unobserve_properties() - self:remove_keybinds() - self:clear() - return self:dispose() - end, - setup_text = function(self, ass) - local scale = calculate_scale_factor() - local margin = options.margin * scale - ass:append("{\\an7}") - ass:pos(margin, margin) - return ass:append("{\\fs" .. tostring(options.font_size * scale) .. "}") - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function() end, - __base = _base_0, - __name = "Page" - }, { - __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 - Page = _class_0 -end -local EncodeWithProgress -do - local _class_0 - local _parent_0 = Page - local _base_0 = { - draw = function(self) - local progress = 100 * ((self.currentTime - self.startTime) / self.duration) - local progressText = string.format("%d%%", progress) - local window_w, window_h = mp.get_osd_size() - local ass = assdraw.ass_new() - ass:new_event() - self:setup_text(ass) - ass:append("Encoding (" .. tostring(bold(progressText)) .. ")\\N") - return mp.set_osd_ass(window_w, window_h, ass.text) - end, - parseLine = function(self, line) - local matchTime = string.match(line, "Encode time[-]pos: ([0-9.]+)") - local matchExit = string.match(line, "Exiting... [(]([%a ]+)[)]") - if matchTime == nil and matchExit == nil then - return - end - if matchTime ~= nil and tonumber(matchTime) > self.currentTime then - self.currentTime = tonumber(matchTime) - end - if matchExit ~= nil then - self.finished = true - self.finishedReason = matchExit - end - end, - startEncode = function(self, command_line) - local copy_command_line - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #command_line do - local arg = command_line[_index_0] - _accum_0[_len_0] = arg - _len_0 = _len_0 + 1 - end - copy_command_line = _accum_0 - end - append(copy_command_line, { - '--term-status-msg=Encode time-pos: ${=time-pos}\\n' - }) - self:show() - local processFd = run_subprocess_popen(copy_command_line) - for line in processFd:lines() do - msg.verbose(string.format('%q', line)) - self:parseLine(line) - self:draw() - end - processFd:close() - self:hide() - if self.finishedReason == "End of file" then - return true - end - return false - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, startTime, endTime) - self.startTime = startTime - self.endTime = endTime - self.duration = endTime - startTime - self.currentTime = startTime - end, - __base = _base_0, - __name = "EncodeWithProgress", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - EncodeWithProgress = _class_0 -end -local get_active_tracks -get_active_tracks = function() - local accepted = { - video = true, - audio = not mp.get_property_bool("mute"), - sub = mp.get_property_bool("sub-visibility") - } - local active = { - video = { }, - audio = { }, - sub = { } - } - for _, track in ipairs(mp.get_property_native("track-list")) do - if track["selected"] and accepted[track["type"]] then - local count = #active[track["type"]] - active[track["type"]][count + 1] = track - end - end - return active -end -local filter_tracks_supported_by_format -filter_tracks_supported_by_format = function(active_tracks, format) - local has_video_codec = format.videoCodec ~= "" - local has_audio_codec = format.audioCodec ~= "" - local supported = { - video = has_video_codec and active_tracks["video"] or { }, - audio = has_audio_codec and active_tracks["audio"] or { }, - sub = has_video_codec and active_tracks["sub"] or { } - } - return supported -end -local append_track -append_track = function(out, track) - local external_flag = { - ["audio"] = "audio-file", - ["sub"] = "sub-file" - } - local internal_flag = { - ["video"] = "vid", - ["audio"] = "aid", - ["sub"] = "sid" - } - if track['external'] and string.len(track['external-filename']) <= 2048 then - return append(out, { - "--" .. tostring(external_flag[track['type']]) .. "=" .. tostring(track['external-filename']) - }) - else - return append(out, { - "--" .. tostring(internal_flag[track['type']]) .. "=" .. tostring(track['id']) - }) - end -end -local append_audio_tracks -append_audio_tracks = function(out, tracks) - local internal_tracks = { } - for _index_0 = 1, #tracks do - local track = tracks[_index_0] - if track['external'] then - append_track(out, track) - else - append(internal_tracks, { - track - }) - end - end - if #internal_tracks > 1 then - local filter_string = "" - for _index_0 = 1, #internal_tracks do - local track = internal_tracks[_index_0] - filter_string = filter_string .. "[aid" .. tostring(track['id']) .. "]" - end - filter_string = filter_string .. "amix[ao]" - return append(out, { - "--lavfi-complex=" .. tostring(filter_string) - }) - else - if #internal_tracks == 1 then - return append_track(out, internal_tracks[1]) - end - end -end -local get_scale_filters -get_scale_filters = function() - local filters = { } - if options.force_square_pixels then - append(filters, { - "lavfi-scale=iw*sar:ih" - }) - end - if options.scale_height > 0 then - append(filters, { - "lavfi-scale=-2:" .. tostring(options.scale_height) - }) - end - return filters -end -local get_fps_filters -get_fps_filters = function() - if options.fps > 0 then - return { - "fps=" .. tostring(options.fps) - } - end - return { } -end -local get_contrast_brightness_and_saturation_filters -get_contrast_brightness_and_saturation_filters = function() - local mpv_brightness = mp.get_property("brightness") - local mpv_contrast = mp.get_property("contrast") - local mpv_saturation = mp.get_property("saturation") - if mpv_brightness == 0 and mpv_contrast == 0 and mpv_saturation == 0 then - return { } - end - local eq_saturation = (mpv_saturation + 100) / 100.0 - local eq_contrast = (mpv_contrast + 100) / 100.0 - local eq_brightness = (mpv_brightness / 50.0 + eq_contrast - 1) / 2.0 - return { - "lavfi-eq=contrast=" .. tostring(eq_contrast) .. ":saturation=" .. tostring(eq_saturation) .. ":brightness=" .. tostring(eq_brightness) - } -end -local append_property -append_property = function(out, property_name, option_name) - option_name = option_name or property_name - local prop = mp.get_property(property_name) - if prop and prop ~= "" then - return append(out, { - "--" .. tostring(option_name) .. "=" .. tostring(prop) - }) - end -end -local append_list_options -append_list_options = function(out, property_name, option_prefix) - option_prefix = option_prefix or property_name - local prop = mp.get_property_native(property_name) - if prop then - for _index_0 = 1, #prop do - local value = prop[_index_0] - append(out, { - "--" .. tostring(option_prefix) .. "-append=" .. tostring(value) - }) - end - end -end -local get_playback_options -get_playback_options = function() - local ret = { } - append_property(ret, "sub-ass-override") - append_property(ret, "sub-ass-force-style") - append_property(ret, "sub-ass-vsfilter-aspect-compat") - append_property(ret, "sub-auto") - append_property(ret, "sub-pos") - append_property(ret, "sub-delay") - append_property(ret, "video-rotate") - append_property(ret, "ytdl-format") - append_property(ret, "deinterlace") - return ret -end -local get_speed_flags -get_speed_flags = function() - local ret = { } - local speed = mp.get_property_native("speed") - if speed ~= 1 then - append(ret, { - "--vf-add=setpts=PTS/" .. tostring(speed), - "--af-add=atempo=" .. tostring(speed), - "--sub-speed=1/" .. tostring(speed) - }) - end - return ret -end -local get_metadata_flags -get_metadata_flags = function() - local title = mp.get_property("filename/no-ext") - return { - "--oset-metadata=title=%" .. tostring(string.len(title)) .. "%" .. tostring(title) - } -end -local apply_current_filters -apply_current_filters = function(filters) - local vf = mp.get_property_native("vf") - msg.verbose("apply_current_filters: got " .. tostring(#vf) .. " currently applied.") - for _index_0 = 1, #vf do - local _continue_0 = false - repeat - local filter = vf[_index_0] - msg.verbose("apply_current_filters: filter name: " .. tostring(filter['name'])) - if filter["enabled"] == false then - _continue_0 = true - break - end - local str = filter["name"] - local params = filter["params"] or { } - for k, v in pairs(params) do - str = str .. ":" .. tostring(k) .. "=%" .. tostring(string.len(v)) .. "%" .. tostring(v) - end - append(filters, { - str - }) - _continue_0 = true - until true - if not _continue_0 then - break - end - end -end -local get_video_filters -get_video_filters = function(format, region) - local filters = { } - append(filters, format:getPreFilters()) - if options.apply_current_filters then - apply_current_filters(filters) - end - if region and region:is_valid() then - append(filters, { - "lavfi-crop=" .. tostring(region.w) .. ":" .. tostring(region.h) .. ":" .. tostring(region.x) .. ":" .. tostring(region.y) - }) - end - append(filters, get_scale_filters()) - append(filters, get_fps_filters()) - append(filters, get_contrast_brightness_and_saturation_filters()) - append(filters, format:getPostFilters()) - return filters -end -local get_video_encode_flags -get_video_encode_flags = function(format, region) - local flags = { } - append(flags, get_playback_options()) - local filters = get_video_filters(format, region) - for _index_0 = 1, #filters do - local f = filters[_index_0] - append(flags, { - "--vf-add=" .. tostring(f) - }) - end - append(flags, get_speed_flags()) - return flags -end -local calculate_bitrate -calculate_bitrate = function(active_tracks, format, length) - if format.videoCodec == "" then - return nil, options.target_filesize * 8 / length - end - local video_kilobits = options.target_filesize * 8 - local audio_kilobits = nil - local has_audio_track = #active_tracks["audio"] > 0 - if options.strict_filesize_constraint and has_audio_track then - audio_kilobits = length * options.strict_audio_bitrate - video_kilobits = video_kilobits - audio_kilobits - end - local video_bitrate = math.floor(video_kilobits / length) - local audio_bitrate = audio_kilobits and math.floor(audio_kilobits / length) or nil - return video_bitrate, audio_bitrate -end -local find_path -find_path = function(startTime, endTime) - local path = mp.get_property('path') - if not path then - return nil, nil, nil, nil, nil - end - local is_stream = not file_exists(path) - local is_temporary = false - if is_stream then - if mp.get_property('file-format') == 'hls' then - path = utils.join_path(parse_directory('~'), 'cache_dump.ts') - mp.command_native({ - 'dump_cache', - seconds_to_time_string(startTime, false, true), - seconds_to_time_string(endTime + 5, false, true), - path - }) - endTime = endTime - startTime - startTime = 0 - is_temporary = true - end - end - return path, is_stream, is_temporary, startTime, endTime -end -local encode -encode = function(region, startTime, endTime) - local format = formats[options.output_format] - local originalStartTime = startTime - local originalEndTime = endTime - local path, is_stream, is_temporary - path, is_stream, is_temporary, startTime, endTime = find_path(startTime, endTime) - if not path then - message("No file is being played") - return - end - local command = { - "mpv", - path, - "--start=" .. seconds_to_time_string(startTime, false, true), - "--end=" .. seconds_to_time_string(endTime, false, true), - "--loop-file=no", - "--no-pause" - } - append(command, format:getCodecFlags()) - local active_tracks = get_active_tracks() - local supported_active_tracks = filter_tracks_supported_by_format(active_tracks, format) - for track_type, tracks in pairs(supported_active_tracks) do - if track_type == "audio" then - append_audio_tracks(command, tracks) - else - for _index_0 = 1, #tracks do - local track = tracks[_index_0] - append_track(command, track) - end - end - end - for track_type, tracks in pairs(supported_active_tracks) do - local _continue_0 = false - repeat - if #tracks > 0 then - _continue_0 = true - break - end - local _exp_0 = track_type - if "video" == _exp_0 then - append(command, { - "--vid=no" - }) - elseif "audio" == _exp_0 then - append(command, { - "--aid=no" - }) - elseif "sub" == _exp_0 then - append(command, { - "--sid=no" - }) - end - _continue_0 = true - until true - if not _continue_0 then - break - end - end - if format.videoCodec ~= "" then - append(command, get_video_encode_flags(format, region)) - end - append(command, format:getFlags()) - if options.write_filename_on_metadata then - append(command, get_metadata_flags()) - end - if format.acceptsBitrate then - if options.target_filesize > 0 then - local length = endTime - startTime - local video_bitrate, audio_bitrate = calculate_bitrate(supported_active_tracks, format, length) - if video_bitrate then - append(command, { - "--ovcopts-add=b=" .. tostring(video_bitrate) .. "k" - }) - end - if audio_bitrate then - append(command, { - "--oacopts-add=b=" .. tostring(audio_bitrate) .. "k" - }) - end - if options.strict_filesize_constraint then - local type = format.videoCodec ~= "" and "ovc" or "oac" - append(command, { - "--" .. tostring(type) .. "opts-add=minrate=" .. tostring(bitrate) .. "k", - "--" .. tostring(type) .. "opts-add=maxrate=" .. tostring(bitrate) .. "k" - }) - end - else - local type = format.videoCodec ~= "" and "ovc" or "oac" - append(command, { - "--" .. tostring(type) .. "opts-add=b=0" - }) - end - end - for token in string.gmatch(options.additional_flags, "[^%s]+") do - command[#command + 1] = token - end - if not options.strict_filesize_constraint then - for token in string.gmatch(options.non_strict_additional_flags, "[^%s]+") do - command[#command + 1] = token - end - if options.crf >= 0 then - append(command, { - "--ovcopts-add=crf=" .. tostring(options.crf) - }) - end - end - local dir = "" - if is_stream then - dir = parse_directory("~") - else - local _ - dir, _ = utils.split_path(path) - end - if options.output_directory ~= "" then - dir = parse_directory(options.output_directory) - end - local formatted_filename = format_filename(originalStartTime, originalEndTime, format) - local out_path = utils.join_path(dir, formatted_filename) - append(command, { - "--o=" .. tostring(out_path) - }) - emit_event("encode-started") - if options.twopass and format.supportsTwopass and not is_stream then - local first_pass_cmdline - do - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #command do - local arg = command[_index_0] - _accum_0[_len_0] = arg - _len_0 = _len_0 + 1 - end - first_pass_cmdline = _accum_0 - end - append(first_pass_cmdline, { - "--ovcopts-add=flags=+pass1" - }) - message("Starting first pass...") - msg.verbose("First-pass command line: ", table.concat(first_pass_cmdline, " ")) - local res = run_subprocess({ - args = first_pass_cmdline, - cancellable = false - }) - if not res then - message("First pass failed! Check the logs for details.") - emit_event("encode-finished", "fail") - return - end - append(command, { - "--ovcopts-add=flags=+pass2" - }) - if format.videoCodec == "libvpx" then - msg.verbose("Patching libvpx pass log file...") - vp8_patch_logfile(get_pass_logfile_path(out_path), endTime - startTime) - end - end - command = format:postCommandModifier(command, region, startTime, endTime) - msg.info("Encoding to", out_path) - msg.verbose("Command line:", table.concat(command, " ")) - if options.run_detached then - message("Started encode, process was detached.") - return utils.subprocess_detached({ - args = command - }) - else - local res = false - if not should_display_progress() then - message("Started encode...") - res = run_subprocess({ - args = command, - cancellable = false - }) - else - local ewp = EncodeWithProgress(startTime, endTime) - res = ewp:startEncode(command) - end - if res then - message("Encoded successfully! Saved to\\N" .. tostring(bold(out_path))) - emit_event("encode-finished", "success") - else - message("Encode failed! Check the logs for details.") - emit_event("encode-finished", "fail") - end - os.remove(get_pass_logfile_path(out_path)) - if is_temporary then - return os.remove(path) - end - end -end -local CropPage -do - local _class_0 - local _parent_0 = Page - local _base_0 = { - reset = function(self) - local dimensions = get_video_dimensions() - local xa, ya - do - local _obj_0 = dimensions.top_left - xa, ya = _obj_0.x, _obj_0.y - end - self.pointA:set_from_screen(xa, ya) - local xb, yb - do - local _obj_0 = dimensions.bottom_right - xb, yb = _obj_0.x, _obj_0.y - end - self.pointB:set_from_screen(xb, yb) - if self.visible then - return self:draw() - end - end, - setPointA = function(self) - local posX, posY = mp.get_mouse_pos() - self.pointA:set_from_screen(posX, posY) - if self.visible then - return self:draw() - end - end, - setPointB = function(self) - local posX, posY = mp.get_mouse_pos() - self.pointB:set_from_screen(posX, posY) - if self.visible then - return self:draw() - end - end, - cancel = function(self) - self:hide() - return self.callback(false, nil) - end, - finish = function(self) - local region = Region() - region:set_from_points(self.pointA, self.pointB) - self:hide() - return self.callback(true, region) - end, - draw_box = function(self, ass) - local region = Region() - region:set_from_points(self.pointA:to_screen(), self.pointB:to_screen()) - local d = get_video_dimensions() - ass:new_event() - ass:append("{\\an7}") - ass:pos(0, 0) - ass:append('{\\bord0}') - ass:append('{\\shad0}') - ass:append('{\\c&H000000&}') - ass:append('{\\alpha&H77}') - ass:draw_start() - ass:rect_cw(d.top_left.x, d.top_left.y, region.x, region.y + region.h) - ass:rect_cw(region.x, d.top_left.y, d.bottom_right.x, region.y) - ass:rect_cw(d.top_left.x, region.y + region.h, region.x + region.w, d.bottom_right.y) - ass:rect_cw(region.x + region.w, region.y, d.bottom_right.x, d.bottom_right.y) - return ass:draw_stop() - end, - draw = function(self) - local window = { } - window.w, window.h = mp.get_osd_size() - local ass = assdraw.ass_new() - self:draw_box(ass) - ass:new_event() - self:setup_text(ass) - ass:append(tostring(bold('Crop:')) .. "\\N") - ass:append(tostring(bold('1:')) .. " change point A (" .. tostring(self.pointA.x) .. ", " .. tostring(self.pointA.y) .. ")\\N") - ass:append(tostring(bold('2:')) .. " change point B (" .. tostring(self.pointB.x) .. ", " .. tostring(self.pointB.y) .. ")\\N") - ass:append(tostring(bold('r:')) .. " reset to whole screen\\N") - ass:append(tostring(bold('ESC:')) .. " cancel crop\\N") - local width, height = math.abs(self.pointA.x - self.pointB.x), math.abs(self.pointA.y - self.pointB.y) - ass:append(tostring(bold('ENTER:')) .. " confirm crop (" .. tostring(width) .. "x" .. tostring(height) .. ")\\N") - return mp.set_osd_ass(window.w, window.h, ass.text) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, callback, region) - self.pointA = VideoPoint() - self.pointB = VideoPoint() - self.keybinds = { - ["1"] = (function() - local _base_1 = self - local _fn_0 = _base_1.setPointA - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["2"] = (function() - local _base_1 = self - local _fn_0 = _base_1.setPointB - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["r"] = (function() - local _base_1 = self - local _fn_0 = _base_1.reset - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["ESC"] = (function() - local _base_1 = self - local _fn_0 = _base_1.cancel - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["ENTER"] = (function() - local _base_1 = self - local _fn_0 = _base_1.finish - return function(...) - return _fn_0(_base_1, ...) - end - end)() - } - self:reset() - self.callback = callback - if region and region:is_valid() then - self.pointA.x = region.x - self.pointA.y = region.y - self.pointB.x = region.x + region.w - self.pointB.y = region.y + region.h - end - end, - __base = _base_0, - __name = "CropPage", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - CropPage = _class_0 -end -local Option -do - local _class_0 - local _base_0 = { - hasPrevious = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - return true - elseif "int" == _exp_0 then - if self.opts.min then - return self.value > self.opts.min - else - return true - end - elseif "list" == _exp_0 then - return self.value > 1 - end - end, - hasNext = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - return true - elseif "int" == _exp_0 then - if self.opts.max then - return self.value < self.opts.max - else - return true - end - elseif "list" == _exp_0 then - return self.value < #self.opts.possibleValues - end - end, - leftKey = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - self.value = not self.value - elseif "int" == _exp_0 then - self.value = self.value - self.opts.step - if self.opts.min and self.opts.min > self.value then - self.value = self.opts.min - end - elseif "list" == _exp_0 then - if self.value > 1 then - self.value = self.value - 1 - end - end - end, - rightKey = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - self.value = not self.value - elseif "int" == _exp_0 then - self.value = self.value + self.opts.step - if self.opts.max and self.opts.max < self.value then - self.value = self.opts.max - end - elseif "list" == _exp_0 then - if self.value < #self.opts.possibleValues then - self.value = self.value + 1 - end - end - end, - getValue = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - return self.value - elseif "int" == _exp_0 then - return self.value - elseif "list" == _exp_0 then - local value, _ - do - local _obj_0 = self.opts.possibleValues[self.value] - value, _ = _obj_0[1], _obj_0[2] - end - return value - end - end, - setValue = function(self, value) - local _exp_0 = self.optType - if "bool" == _exp_0 then - self.value = value - elseif "int" == _exp_0 then - self.value = value - elseif "list" == _exp_0 then - local set = false - for i, possiblePair in ipairs(self.opts.possibleValues) do - local possibleValue, _ - possibleValue, _ = possiblePair[1], possiblePair[2] - if possibleValue == value then - set = true - self.value = i - break - end - end - if not set then - return msg.warn("Tried to set invalid value " .. tostring(value) .. " to " .. tostring(self.displayText) .. " option.") - end - end - end, - getDisplayValue = function(self) - local _exp_0 = self.optType - if "bool" == _exp_0 then - return self.value and "yes" or "no" - elseif "int" == _exp_0 then - if self.opts.altDisplayNames and self.opts.altDisplayNames[self.value] then - return self.opts.altDisplayNames[self.value] - else - return tostring(self.value) - end - elseif "list" == _exp_0 then - local value, displayValue - do - local _obj_0 = self.opts.possibleValues[self.value] - value, displayValue = _obj_0[1], _obj_0[2] - end - return displayValue or value - end - end, - draw = function(self, ass, selected) - if selected then - ass:append(tostring(bold(self.displayText)) .. ": ") - else - ass:append(tostring(self.displayText) .. ": ") - end - if self:hasPrevious() then - ass:append("◀ ") - end - ass:append(self:getDisplayValue()) - if self:hasNext() then - ass:append(" ▶") - end - return ass:append("\\N") - end, - optVisible = function(self) - if self.visibleCheckFn == nil then - return true - else - return self.visibleCheckFn() - end - end - } - _base_0.__index = _base_0 - _class_0 = setmetatable({ - __init = function(self, optType, displayText, value, opts, visibleCheckFn) - self.optType = optType - self.displayText = displayText - self.opts = opts - self.value = 1 - self.visibleCheckFn = visibleCheckFn - return self:setValue(value) - end, - __base = _base_0, - __name = "Option" - }, { - __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 - Option = _class_0 -end -local EncodeOptionsPage -do - local _class_0 - local _parent_0 = Page - local _base_0 = { - getCurrentOption = function(self) - return self.options[self.currentOption][2] - end, - leftKey = function(self) - (self:getCurrentOption()):leftKey() - return self:draw() - end, - rightKey = function(self) - (self:getCurrentOption()):rightKey() - return self:draw() - end, - prevOpt = function(self) - for i = self.currentOption - 1, 1, -1 do - if self.options[i][2]:optVisible() then - self.currentOption = i - break - end - end - return self:draw() - end, - nextOpt = function(self) - for i = self.currentOption + 1, #self.options do - if self.options[i][2]:optVisible() then - self.currentOption = i - break - end - end - return self:draw() - end, - confirmOpts = function(self) - for _, optPair in ipairs(self.options) do - local optName, opt - optName, opt = optPair[1], optPair[2] - options[optName] = opt:getValue() - end - self:hide() - return self.callback(true) - end, - cancelOpts = function(self) - self:hide() - return self.callback(false) - end, - draw = function(self) - local window_w, window_h = mp.get_osd_size() - local ass = assdraw.ass_new() - ass:new_event() - self:setup_text(ass) - ass:append(tostring(bold('Options:')) .. "\\N\\N") - for i, optPair in ipairs(self.options) do - local opt = optPair[2] - if opt:optVisible() then - opt:draw(ass, self.currentOption == i) - end - end - ass:append("\\N▲ / ▼: navigate\\N") - ass:append(tostring(bold('ENTER:')) .. " confirm options\\N") - ass:append(tostring(bold('ESC:')) .. " cancel\\N") - return mp.set_osd_ass(window_w, window_h, ass.text) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, callback) - self.callback = callback - self.currentOption = 1 - local scaleHeightOpts = { - possibleValues = { - { - -1, - "no" - }, - { - 144 - }, - { - 240 - }, - { - 360 - }, - { - 480 - }, - { - 540 - }, - { - 720 - }, - { - 1080 - }, - { - 1440 - }, - { - 2160 - } - } - } - local filesizeOpts = { - step = 250, - min = 0, - altDisplayNames = { - [0] = "0 (constant quality)" - } - } - local crfOpts = { - step = 1, - min = -1, - altDisplayNames = { - [-1] = "disabled" - } - } - local fpsOpts = { - possibleValues = { - { - -1, - "source" - }, - { - 15 - }, - { - 24 - }, - { - 30 - }, - { - 48 - }, - { - 50 - }, - { - 60 - }, - { - 120 - }, - { - 240 - } - } - } - local formatIds = { - "webm-vp8", - "webm-vp9", - "mp4", - "mp4-nvenc", - "raw", - "mp3", - "gif" - } - local formatOpts = { - possibleValues = (function() - local _accum_0 = { } - local _len_0 = 1 - for _index_0 = 1, #formatIds do - local fId = formatIds[_index_0] - _accum_0[_len_0] = { - fId, - formats[fId].displayName - } - _len_0 = _len_0 + 1 - end - return _accum_0 - end)() - } - local gifDitherOpts = { - possibleValues = { - { - 0, - "bayer_scale 0" - }, - { - 1, - "bayer_scale 1" - }, - { - 2, - "bayer_scale 2" - }, - { - 3, - "bayer_scale 3" - }, - { - 4, - "bayer_scale 4" - }, - { - 5, - "bayer_scale 5" - }, - { - 6, - "sierra2_4a" - } - } - } - self.options = { - { - "output_format", - Option("list", "Output Format", options.output_format, formatOpts) - }, - { - "twopass", - Option("bool", "Two Pass", options.twopass) - }, - { - "apply_current_filters", - Option("bool", "Apply Current Video Filters", options.apply_current_filters) - }, - { - "scale_height", - Option("list", "Scale Height", options.scale_height, scaleHeightOpts) - }, - { - "strict_filesize_constraint", - Option("bool", "Strict Filesize Constraint", options.strict_filesize_constraint) - }, - { - "write_filename_on_metadata", - Option("bool", "Write Filename on Metadata", options.write_filename_on_metadata) - }, - { - "target_filesize", - Option("int", "Target Filesize", options.target_filesize, filesizeOpts) - }, - { - "crf", - Option("int", "CRF", options.crf, crfOpts) - }, - { - "fps", - Option("list", "FPS", options.fps, fpsOpts) - }, - { - "gif_dither", - Option("list", "GIF Dither Type", options.gif_dither, gifDitherOpts, function() - return self.options[1][2]:getValue() == "gif" - end) - }, - { - "force_square_pixels", - Option("bool", "Force Square Pixels", options.force_square_pixels) - } - } - self.keybinds = { - ["LEFT"] = (function() - local _base_1 = self - local _fn_0 = _base_1.leftKey - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["RIGHT"] = (function() - local _base_1 = self - local _fn_0 = _base_1.rightKey - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["UP"] = (function() - local _base_1 = self - local _fn_0 = _base_1.prevOpt - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["DOWN"] = (function() - local _base_1 = self - local _fn_0 = _base_1.nextOpt - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["ENTER"] = (function() - local _base_1 = self - local _fn_0 = _base_1.confirmOpts - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["ESC"] = (function() - local _base_1 = self - local _fn_0 = _base_1.cancelOpts - return function(...) - return _fn_0(_base_1, ...) - end - end)() - } - end, - __base = _base_0, - __name = "EncodeOptionsPage", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - EncodeOptionsPage = _class_0 -end -local PreviewPage -do - local _class_0 - local _parent_0 = Page - local _base_0 = { - prepare = function(self) - local vf = mp.get_property_native("vf") - vf[#vf + 1] = { - name = "sub" - } - if self.region:is_valid() then - vf[#vf + 1] = { - name = "crop", - params = { - w = tostring(self.region.w), - h = tostring(self.region.h), - x = tostring(self.region.x), - y = tostring(self.region.y) - } - } - end - mp.set_property_native("vf", vf) - if self.startTime > -1 and self.endTime > -1 then - mp.set_property_native("ab-loop-a", self.startTime) - mp.set_property_native("ab-loop-b", self.endTime) - mp.set_property_native("time-pos", self.startTime) - end - return mp.set_property_native("pause", false) - end, - dispose = function(self) - mp.set_property("ab-loop-a", "no") - mp.set_property("ab-loop-b", "no") - for prop, value in pairs(self.originalProperties) do - mp.set_property_native(prop, value) - end - end, - draw = function(self) - local window_w, window_h = mp.get_osd_size() - local ass = assdraw.ass_new() - ass:new_event() - self:setup_text(ass) - ass:append("Press " .. tostring(bold('ESC')) .. " to exit preview.\\N") - return mp.set_osd_ass(window_w, window_h, ass.text) - end, - cancel = function(self) - self:hide() - return self.callback() - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self, callback, region, startTime, endTime) - self.callback = callback - self.originalProperties = { - ["vf"] = mp.get_property_native("vf"), - ["time-pos"] = mp.get_property_native("time-pos"), - ["pause"] = mp.get_property_native("pause") - } - self.keybinds = { - ["ESC"] = (function() - local _base_1 = self - local _fn_0 = _base_1.cancel - return function(...) - return _fn_0(_base_1, ...) - end - end)() - } - self.region = region - self.startTime = startTime - self.endTime = endTime - self.isLoop = false - end, - __base = _base_0, - __name = "PreviewPage", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - PreviewPage = _class_0 -end -local MainPage -do - local _class_0 - local _parent_0 = Page - local _base_0 = { - setStartTime = function(self) - self.startTime = mp.get_property_number("time-pos") - if self.visible then - self:clear() - return self:draw() - end - end, - setEndTime = function(self) - self.endTime = mp.get_property_number("time-pos") - if self.visible then - self:clear() - return self:draw() - end - end, - setupStartAndEndTimes = function(self) - if mp.get_property_native("duration") then - self.startTime = 0 - self.endTime = mp.get_property_native("duration") - else - self.startTime = -1 - self.endTime = -1 - end - if self.visible then - self:clear() - return self:draw() - end - end, - draw = function(self) - local window_w, window_h = mp.get_osd_size() - local ass = assdraw.ass_new() - ass:new_event() - self:setup_text(ass) - ass:append(tostring(bold('WebM maker')) .. "\\N\\N") - ass:append(tostring(bold('c:')) .. " crop\\N") - ass:append(tostring(bold('1:')) .. " set start time (current is " .. tostring(seconds_to_time_string(self.startTime)) .. ")\\N") - ass:append(tostring(bold('2:')) .. " set end time (current is " .. tostring(seconds_to_time_string(self.endTime)) .. ")\\N") - ass:append(tostring(bold('o:')) .. " change encode options\\N") - ass:append(tostring(bold('p:')) .. " preview\\N") - ass:append(tostring(bold('e:')) .. " encode\\N\\N") - ass:append(tostring(bold('ESC:')) .. " close\\N") - return mp.set_osd_ass(window_w, window_h, ass.text) - end, - show = function(self) - _class_0.__parent.show(self) - return emit_event("show-main-page") - end, - onUpdateCropRegion = function(self, updated, newRegion) - if updated then - self.region = newRegion - end - return self:show() - end, - crop = function(self) - self:hide() - local cropPage = CropPage((function() - local _base_1 = self - local _fn_0 = _base_1.onUpdateCropRegion - return function(...) - return _fn_0(_base_1, ...) - end - end)(), self.region) - return cropPage:show() - end, - onOptionsChanged = function(self, updated) - return self:show() - end, - changeOptions = function(self) - self:hide() - local encodeOptsPage = EncodeOptionsPage((function() - local _base_1 = self - local _fn_0 = _base_1.onOptionsChanged - return function(...) - return _fn_0(_base_1, ...) - end - end)()) - return encodeOptsPage:show() - end, - onPreviewEnded = function(self) - return self:show() - end, - preview = function(self) - self:hide() - local previewPage = PreviewPage((function() - local _base_1 = self - local _fn_0 = _base_1.onPreviewEnded - return function(...) - return _fn_0(_base_1, ...) - end - end)(), self.region, self.startTime, self.endTime) - return previewPage:show() - end, - encode = function(self) - self:hide() - if self.startTime < 0 then - message("No start time, aborting") - return - end - if self.endTime < 0 then - message("No end time, aborting") - return - end - if self.startTime >= self.endTime then - message("Start time is ahead of end time, aborting") - return - end - return encode(self.region, self.startTime, self.endTime) - end - } - _base_0.__index = _base_0 - setmetatable(_base_0, _parent_0.__base) - _class_0 = setmetatable({ - __init = function(self) - self.keybinds = { - ["c"] = (function() - local _base_1 = self - local _fn_0 = _base_1.crop - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["1"] = (function() - local _base_1 = self - local _fn_0 = _base_1.setStartTime - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["2"] = (function() - local _base_1 = self - local _fn_0 = _base_1.setEndTime - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["o"] = (function() - local _base_1 = self - local _fn_0 = _base_1.changeOptions - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["p"] = (function() - local _base_1 = self - local _fn_0 = _base_1.preview - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["e"] = (function() - local _base_1 = self - local _fn_0 = _base_1.encode - return function(...) - return _fn_0(_base_1, ...) - end - end)(), - ["ESC"] = (function() - local _base_1 = self - local _fn_0 = _base_1.hide - return function(...) - return _fn_0(_base_1, ...) - end - end)() - } - self.startTime = -1 - self.endTime = -1 - self.region = Region() - end, - __base = _base_0, - __name = "MainPage", - __parent = _parent_0 - }, { - __index = function(cls, name) - local val = rawget(_base_0, name) - if val == nil then - local parent = rawget(cls, "__parent") - if parent then - return parent[name] - end - 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 - MainPage = _class_0 -end -monitor_dimensions() -local mainPage = MainPage() -mp.add_key_binding(options.keybind, "display-webm-encoder", (function() - local _base_0 = mainPage - local _fn_0 = _base_0.show - return function(...) - return _fn_0(_base_0, ...) - end -end)(), { - repeatable = false -}) -mp.register_event("file-loaded", (function() - local _base_0 = mainPage - local _fn_0 = _base_0.setupStartAndEndTimes - return function(...) - return _fn_0(_base_0, ...) - end -end)()) -msg.verbose("Loaded mpv-webm script!") -return emit_event("script-loaded") diff --git a/config/X/mpv/scripts/youtube-quality.lua b/config/X/mpv/scripts/youtube-quality.lua deleted file mode 100755 index 1331210..0000000 --- a/config/X/mpv/scripts/youtube-quality.lua +++ /dev/null @@ -1,275 +0,0 @@ --- 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 yt-dlp 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 = "yt-dlp", - 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 yt-dlp...", 60) - - if not (ytdl.searched) then - local ytdl_mcd = mp.find_config_file("yt-dlp") - if not (ytdl_mcd == nil) then - msg.verbose("found yt-dlp 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("yt-dlp 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 |