kernel still breaking. updated name which may have been issue

This commit is contained in:
tumillanino
2026-04-09 15:58:55 +10:00
parent 1c59f8a718
commit c6ffa3591f
155 changed files with 6219 additions and 1 deletions

View File

@@ -0,0 +1,68 @@
# Arch Linux box for CLI use
[box]
image=ghcr.io/askpng/box
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox"
exported_bins="bat btop eza glow pingu tldr"
# Arch Linux box for gaming use
[gamebox]
image=ghcr.io/askpng/gamebox:latest
pull=true
replace=true
nvidia=false
init=false
entry=false
start_now=true
init_hooks=ln -sf /usr/bin/distrobox-host-exec /usr/local/bin/xdg-open
exported_apps="blackbox celluloid hatt lutris megabasterd steam vesktop"
# BlueBuild-CLI
[bluebuild-cli]
image=ghcr.io/blue-build/cli:latest-alpine
additional_packages="nano bat fish git"
replace=true
# Debian
[debian]
image=quay.io/toolbx-images/debian-toolbox:unstable
additional_packages="nano bat fish"
replace=true
[fedora]
image=ghcr.io/ublue-os/fedora-distrobox:latest
additional_packages="nano bat fish"
#[bluefin-cli]
#image=ghcr.io/ublue-os/bluefin-cli
#nvidia=true
#[opensuse]
#image=quay.io/toolbx-images/opensuse-toolbox:tumbleweed
#nvidia=true
#[ubuntu]
#image=ghcr.io/ublue-os/ubuntu-toolbox:latest
#nvidia=true
#[alma]
#image=quay.io/toolbx-images/almalinux-toolbox:latest
#nvidia=true
#[centos]
#image=quay.io/toolbx-images/centos-toolbox:latest
#nvidia=true
#[wolfi]
#image=ghcr.io/ublue-os/wolfi-toolbox
#nvidia=true
#[wolfi-dx]
#image=ghcr.io/ublue-os/wolfi-dx-toolbox
#nvidia=true

View File

@@ -0,0 +1,4 @@
container_always_pull="1"
container_generate_entry=1
container_manager="podman"
non_interactive="1"

View File

@@ -0,0 +1,7 @@
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# For option meanings, see rpm-ostreed.conf(5).
[Daemon]
AutomaticUpdatePolicy=stage
#IdleExitTimeout=60

View File

@@ -0,0 +1,50 @@
################### File Generated by Goverlay ###################
legacy_layout=false
background_alpha=0.0
round_corners=0
background_alpha=0.0
background_color=000000
font_size=14
text_color=FFFFFF
position=top-left
toggle_hud=Shift_R+F12
pci_dev=0:08:00.0
table_columns=3
gpu_text=GPU
gpu_stats
gpu_temp
gpu_color=2E9762
cpu_text=CPU
cpu_stats
cpu_temp
cpu_color=2E97CB
vram
vram_color=AD64C1
ram
ram_color=C26693
fps
fps_limit_method=late
toggle_fps_limit=Shift_L+F1
fps_limit=90
fps_color_change
fps_color=B22222,F9F06B,99C1F1
fps_value=30,90
#offset=0
output_folder=/var/home/mel
log_duration=30
autostart_log=0
log_interval=100
toggle_logging=Shift_L+F2

View File

@@ -0,0 +1,42 @@
## GENERAL ##
## profile ##
profile=fast
## hardware acceleration ##
# vo=gpu-next
# hwdec=auto
gpu-context=wayland,auto
vo=dmabuf-wayland,gpu-next
hwdec=auto-safe
# others #
save-position-on-quit=yes
keep-open=yes
border=yes
screenshot-directory="~/Pictures/mpv/"
screenshot-template="%F - [%P]v%#01n"
screenshot-format=webp
screenshot-webp-quality=90
slang=eng,en,enUS,en-US,English,jpn,jp,jap,Japanese
sub-font-size=32
volume-max=100
## INPUT ##
## OSD ##
osd-duration=2000
osd-playing-msg='${filename}'
# osc-seekbarstyle=bar
# osd-font-size=20
## resize window ##
autofit-larger=75%x75%
## yt-dlp ##
[protocol.https]
prefetch-playlist=yes
cache-secs=10
osd-playing-msg='${media-title}'
ytdl-format="bestvideo[height<=1080]+bestaudio"
ytdl-raw-options=cookies-from-browser=firefox

View File

@@ -0,0 +1,333 @@
-- Copyright (c) 2021, Eisa AlAwadhi
-- License: BSD 2-Clause License
-- Creator: Eisa AlAwadhi
-- Project: SmartCopyPaste
-- Version: 2.4.1
local utils = require 'mp.utils'
local msg = require 'mp.msg'
local protocols
local extensions
local pasted = false
----------------------------USER CUSTOMIZATION SETTINGS-----------------------------------
--These settings are for users to manually change some options in the script.
--Keybinds can be defined in the bottom of the script.
local device = nil --nil is for automatic device detection, or manually change to: 'windows' or 'mac' or 'linux'
local linux_copy = 'wl-copy' --copy command that will be used in Linux. OR write a different command
local linux_paste = 'wl-paste' --paste command that will be used in Linux. OR write a different command
local mac_copy = 'pbcopy' --copy command that will be used in MAC. OR write a different command
local mac_paste = 'pbpaste' --paste command that will be used in MAC. OR write a different command
local windows_copy = 'powershell' --'powershell' is for using windows powershell to copy. OR write the copy command, e.g: ' clip'
local windows_paste = 'powershell' --'powershell' is for using windows powershell to paste. OR write the paste command
local offset = -0.65 --change to 0 so that pasting resumes from the exact position, or decrease the value so that it gives you a little preview before reaching the exact pasted position
local paste_anything = false --false is for specific paste based on the specified extensions and protocols. Change to true so paste accepts anything (not recommended to change this).
if not paste_anything then
protocols = { --add below (after a comma) any protocol you want SmartCopyPaste to work with; e.g: ,'ftp://'
'https?://' ,'magnet:'
}
extensions = { --add below (after a comma) any extension you want SmartCopyPaste to work with; e.g: ,'pdf'
--video & audio
'ac3', 'a52', 'eac3', 'mlp', 'dts', 'dts-hd', 'dtshd', 'true-hd', 'thd', 'truehd', 'thd+ac3', 'tta', 'pcm', 'wav', 'aiff', 'aif', 'aifc', 'amr', 'awb', 'au', 'snd', 'lpcm', 'yuv', 'y4m', 'ape', 'wv', 'shn', 'm2ts', 'm2t', 'mts', 'mtv', 'ts', 'tsv', 'tsa', 'tts', 'trp', 'adts', 'adt', 'mpa', 'm1a', 'm2a', 'mp1', 'mp2', 'mp3', 'mpeg', 'mpg', 'mpe', 'mpeg2', 'm1v', 'm2v', 'mp2v', 'mpv', 'mpv2', 'mod', 'tod', 'vob', 'vro', 'evob', 'evo', 'mpeg4', 'm4v', 'mp4', 'mp4v', 'mpg4', 'm4a', 'aac', 'h264', 'avc', 'x264', '264', 'hevc', 'h265', 'x265', '265', 'flac', 'oga', 'ogg', 'opus', 'spx', 'ogv', 'ogm', 'ogx', 'mkv', 'mk3d', 'mka', 'webm', 'weba', 'avi', 'vfw', 'divx', '3iv', 'xvid', 'nut', 'flic', 'fli', 'flc', 'nsv', 'gxf', 'mxf', 'wma', 'wm', 'wmv', 'asf', 'dvr-ms', 'dvr', 'wtv', 'dv', 'hdv', 'flv','f4v', 'f4a', 'qt', 'mov', 'hdmov', 'rm', 'rmvb', 'ra', 'ram', '3ga', '3ga2', '3gpp', '3gp', '3gp2', '3g2', 'ay', 'gbs', 'gym', 'hes', 'kss', 'nsf', 'nsfe', 'sap', 'spc', 'vgm', 'vgz', 'm3u', 'm3u8', 'pls', 'cue',
--images
"ase", "art", "bmp", "blp", "cd5", "cit", "cpt", "cr2", "cut", "dds", "dib", "djvu", "egt", "exif", "gif", "gpl", "grf", "icns", "ico", "iff", "jng", "jpeg", "jpg", "jfif", "jp2", "jps", "lbm", "max", "miff", "mng", "msp", "nitf", "ota", "pbm", "pc1", "pc2", "pc3", "pcf", "pcx", "pdn", "pgm", "PI1", "PI2", "PI3", "pict", "pct", "pnm", "pns", "ppm", "psb", "psd", "pdd", "psp", "px", "pxm", "pxr", "qfx", "raw", "rle", "sct", "sgi", "rgb", "int", "bw", "tga", "tiff", "tif", "vtf", "xbm", "xcf", "xpm", "3dv", "amf", "ai", "awg", "cgm", "cdr", "cmx", "dxf", "e2d", "egt", "eps", "fs", "gbr", "odg", "svg", "stl", "vrml", "x3d", "sxd", "v2d", "vnd", "wmf", "emf", "art", "xar", "png", "webp", "jxr", "hdp", "wdp", "cur", "ecw", "iff", "lbm", "liff", "nrrd", "pam", "pcx", "pgf", "sgi", "rgb", "rgba", "bw", "int", "inta", "sid", "ras", "sun", "tga",
--other types
'torrent'
}
---------------------------END OF USER CUSTOMIZATION SETTINGS------------------------
else
protocols = {''}
extensions = {''}
end
if not device then
if os.getenv('windir') ~= nil then
device = 'windows'
elseif os.execute '[ -d "/Applications" ]' == 0 and os.execute '[ -d "/Library" ]' == 0 or os.execute '[ -d "/Applications" ]' == true and os.execute '[ -d "/Library" ]' == true then
device = 'mac'
else
device = 'linux'
end
end
function handleres(res, args)
if not res.error and res.status == 0 then
return res.stdout
else
msg.error("There was an error getting "..device.." clipboard: ")
msg.error(" Status: "..(res.status or ""))
msg.error(" Error: "..(res.error or ""))
msg.error(" stdout: "..(res.stdout or ""))
msg.error("args: "..utils.to_string(args))
return ''
end
end
function os.capture(cmd, raw)
local f = assert(io.popen(cmd, 'r'))
local s = assert(f:read('*a'))
f:close()
if raw then return s end
s = string.gsub(s, '^%s+', '')
s = string.gsub(s, '%s+$', '')
s = string.gsub(s, '[\n\r]+', ' ')
return s
end
local function get_extension(path)
match = string.match(path, '%.([^%.]+)$' )
if match == nil then
return 'nomatch'
else
return match
end
end
local function get_extentionpath(path)
match = string.match(path,'(.*)%.([^%.]+)$')
if match == nil then
return 'nomatch'
else
return match
end
end
local function has_extension (tab, val)
for index, value in ipairs(tab) do
if value == val then
return true
end
end
return false
end
local function starts_protocol (tab, val)
for index, value in ipairs(tab) do
if (val:find(value) == 1) then
return true
end
end
return false
end
function get_clipboard()
local clip
if device == 'linux' then
clip = os.capture(linux_paste, false)
return clip
elseif device == 'windows' then
if windows_paste == 'powershell' then
local args = {
'powershell', '-NoProfile', '-Command', [[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
$clip = Get-Clipboard -Raw -Format Text -TextFormatType UnicodeText
if ($clip) {
$clip = $clip
}
else {
$clip = Get-Clipboard -Raw -Format FileDropList
}
$u8clip = [System.Text.Encoding]::UTF8.GetBytes($clip)
[Console]::OpenStandardOutput().Write($u8clip, 0, $u8clip.Length)
}]]
}
return handleres(utils.subprocess({ args = args, cancellable = false }), args)
else
clip = os.capture(windows_paste, false)
return clip
end
elseif device == 'mac' then
clip = os.capture(mac_paste, false)
return clip
end
return ''
end
function set_clipboard(text)
local pipe
if device == 'linux' then
pipe = io.popen(linux_copy, 'w')
pipe:write(text)
pipe:close()
elseif device == 'windows' then
if windows_copy == 'powershell' then
local res = utils.subprocess({ args = {
'powershell', '-NoProfile', '-Command', string.format([[& {
Trap {
Write-Error -ErrorRecord $_
Exit 1
}
Add-Type -AssemblyName PresentationCore
[System.Windows.Clipboard]::SetText('%s')
}]], text)
} })
else
pipe = io.popen(windows_copy,'w')
pipe:write(text)
pipe:close()
end
elseif device == 'mac' then
pipe = io.popen(mac_copy,'w')
pipe:write(text)
pipe:close()
end
return ''
end
local function copy()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
local time = math.floor(mp.get_property_number('time-pos'))
mp.osd_message("Copied:\n"..filePath..' |time='..tostring(time))
set_clipboard(filePath..' |time='..tostring(time))
else
mp.osd_message('Failed to Copy\nNo Video Found')
end
end
local function copy_path()
local filePath = mp.get_property_native('path')
if (filePath ~= nil) then
mp.osd_message("Copied Video Only:\n"..filePath)
set_clipboard(filePath)
else
return false
end
end
function paste()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
local time
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
time = string.match(clip, ' |time=(.*)')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
local seekTime
if (filePath == nil) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath == nil) and (starts_protocol(protocols, videoFile)) then
mp.osd_message("Pasted:\n"..videoFile)
mp.commandv('loadfile', videoFile)
elseif (filePath ~= nil) and (filePath ~= videoFile) and has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) and (filePath ~= videoFile) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
elseif (filePath == videoFile) and (time == nil) then
mp.osd_message('Same file is already running:\n'..clip)
elseif (filePath == videoFile) and (time ~= nil) then
mp.osd_message('Resumed to Copied Time')
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
else
mp.osd_message('Failed to Paste\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
function paste_playlist()
mp.osd_message("Pasting...")
local clip = get_clipboard()
clip = string.gsub(clip, "[\r\n]" , "")
local filePath = mp.get_property_native('path')
if string.match(clip, '(.*) |time=') then
videoFile = string.match(clip, '(.*) |time=')
elseif string.match(clip, '^\"(.*)\"$') then
videoFile = string.match(clip, '^\"(.*)\"$')
else
videoFile = clip
end
local currentVideoExtension = string.lower(get_extension(videoFile))
local currentVideoExtensionPath = (get_extentionpath(videoFile))
if has_extension(extensions, currentVideoExtension) and (currentVideoExtensionPath~= '') or (starts_protocol(protocols, videoFile)) then
mp.osd_message('Pasted Into Playlist:\n'..videoFile)
mp.commandv('loadfile', videoFile, 'append-play')
else
mp.osd_message('Failed to Add Into Playlist\nPasted Unsupported Item:\n'..clip)
end
pasted = true
end
mp.register_event('end-file', function()
pasted = false
end)
mp.register_event('file-loaded', function()
if (pasted == true) then
local clip = get_clipboard()
local time = string.match(clip, ' |time=(.*)')
local videoFile = string.match(clip, '(.*) |time=')
local filePath = mp.get_property_native('path')
local seekTime
if (filePath == videoFile) and (time ~= nil) then
seekTime = time + offset
if (seekTime < 0) then
seekTime = 0
end
mp.commandv('seek', seekTime, 'absolute', 'exact')
end
else
return false
end
end)
---------------------------KEYBINDS CUSTOMIZATION SETTINGS---------------------------------
if device == 'mac' then --MAC OS Keybinds
mp.add_key_binding('Meta+alt+c', 'copy-path', copy_path)
mp.add_key_binding('Meta+alt+C', 'copy-pathCaps', copy_path)
mp.add_key_binding('Meta+alt+v', 'paste-playlist', paste_playlist)
mp.add_key_binding('Meta+alt+V', 'paste-playlistCaps', paste_playlist)
else --Windows and Linux Keybinds
mp.add_key_binding('ctrl+c', 'copy-path', copy_path)
mp.add_key_binding('ctrl+v', 'paste-playlist', paste_playlist)
end
---------------------END OF KEYBINDS CUSTOMIZATION SETTINGS---------------------------------

View File

@@ -0,0 +1,56 @@
---@class ClipshotOptions
---@field name string
---@field type string
local o = {
name = 'mpv-screenshot.jpeg',
type = '' -- defaults to jpeg
}
require('mp.options').read_options(o, 'clipshot')
local file, cmd
local lib = package.cpath:match('%p[\\|/]?%p(%a+)')
if lib == 'so' then -- Linux/BSD
file = '/tmp/'..o.name
if os.getenv('XDG_SESSION_TYPE') == 'wayland' then -- Wayland
cmd = {'sh', '-c', ('wl-copy < %q'):format(image)}
else -- Xorg
local type = o.type ~= '' and o.type or 'image/jpeg'
cmd = {'xclip', '-sel', 'c', '-t', type, '-i', file}
end
elseif lib == 'dll' then -- Windows
file = os.getenv('TEMP')..'\\'..o.name
cmd = {
'powershell', '-NoProfile', '-Command', ([[& {
Add-Type -Assembly System.Windows.Forms;
Add-Type -Assembly System.Drawing;
$shot = [Drawing.Image]::FromFile(%q);
[Windows.Forms.Clipboard]::SetImage($shot);
}]]):format(file)
}
else -- MacOS
file = os.getenv('TMPDIR')..'/'..o.name
-- png: «class PNGf»
local type = o.type ~= '' and o.type or 'JPEG picture'
cmd = {
'osascript', '-e', ([[
set the clipboard to ( ¬
read (POSIX file %q) as %s)
]]):format(file, type)
}
end
---@param arg string
---@return fun()
local function clipshot(arg)
return function()
mp.commandv('screenshot-to-file', file, arg)
mp.command_native_async({'run', unpack(cmd)}, function(suc, _, err)
mp.osd_message(suc and 'Copied screenshot to clipboard' or err, 1)
end)
end
end
mp.add_key_binding('c', 'clipshot-subs', clipshot('subtitles'))
mp.add_key_binding('C', 'clipshot-video', clipshot('video'))
mp.add_key_binding('Alt+c', 'clipshot-window', clipshot('window'))

View File

@@ -0,0 +1,418 @@
-- reload.lua
--
-- When an online video is stuck buffering or got very slow CDN
-- source, restarting often helps. This script provides automatic
-- reloading of videos that doesn't have buffering progress for some
-- time while keeping the current time position. It also adds `Ctrl+r`
-- keybinding to reload video manually.
--
-- SETTINGS
--
-- To override default setting put the `lua-settings/reload.conf` file in
-- mpv user folder, on linux it is `~/.config/mpv`. NOTE: config file
-- name should match the name of the script.
--
-- Default `reload.conf` settings:
--
-- ```
-- # enable automatic reload on timeout
-- # when paused-for-cache event fired, we will wait
-- # paused_for_cache_timer_timeout sedonds and then reload the video
-- paused_for_cache_timer_enabled=yes
--
-- # checking paused_for_cache property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- paused_for_cache_timer_interval=1
--
-- # time in seconds to wait until reload
-- paused_for_cache_timer_timeout=10
--
-- # enable automatic reload based on demuxer cache
-- # if demuxer-cache-time property didn't change in demuxer_cache_timer_timeout
-- # time interval, the video will be reloaded as soon as demuxer cache depleated
-- demuxer_cache_timer_enabled=yes
--
-- # checking demuxer-cache-time property interval in seconds,
-- # can not be less than 0.05 (50 ms)
-- demuxer_cache_timer_interval=2
--
-- # if demuxer cache didn't receive any data during demuxer_cache_timer_timeout
-- # we decide that it has no progress and will reload the stream when
-- # paused_for_cache event happens
-- demuxer_cache_timer_timeout=20
--
-- # when the end-of-file is reached, reload the stream to check
-- # if there is more content available.
-- reload_eof_enabled=no
--
-- # keybinding to reload stream from current time position
-- # you can disable keybinding by setting it to empty value
-- # reload_key_binding=
-- reload_key_binding=Ctrl+r
-- ```
--
-- DEBUGGING
--
-- Debug messages will be printed to stdout with mpv command line option
-- `--msg-level='reload=debug'`. You may also need to add the `--no-msg-color`
-- option to make the debug logs visible if you are using a dark colorscheme
-- in terminal.
local msg = require 'mp.msg'
local options = require 'mp.options'
local utils = require 'mp.utils'
local settings = {
paused_for_cache_timer_enabled = true,
paused_for_cache_timer_interval = 1,
paused_for_cache_timer_timeout = 10,
demuxer_cache_timer_enabled = true,
demuxer_cache_timer_interval = 2,
demuxer_cache_timer_timeout = 20,
reload_eof_enabled = false,
reload_key_binding = "Ctrl+r",
}
-- global state stores properties between reloads
local property_path = nil
local property_time_pos = 0
local property_keep_open = nil
-- FSM managing the demuxer cache.
--
-- States:
--
-- * fetch - fetching new data
-- * stale - unable to fetch new data for time < 'demuxer_cache_timer_timeout'
-- * stuck - unable to fetch new data for time >= 'demuxer_cache_timer_timeout'
--
-- State transitions:
--
-- +---------------------------+
-- v |
-- +-------+ +-------+ +-------+
-- + fetch +<--->+ stale +---->+ stuck |
-- +-------+ +-------+ +-------+
-- | ^ | ^ | ^
-- +---+ +---+ +---+
local demuxer_cache = {
timer = nil,
state = {
name = 'uninitialized',
demuxer_cache_time = 0,
in_state_time = 0,
},
events = {
continue_fetch = { name = 'continue_fetch', from = 'fetch', to = 'fetch' },
continue_stale = { name = 'continue_stale', from = 'stale', to = 'stale' },
continue_stuck = { name = 'continue_stuck', from = 'stuck', to = 'stuck' },
fetch_to_stale = { name = 'fetch_to_stale', from = 'fetch', to = 'stale' },
stale_to_fetch = { name = 'stale_to_fetch', from = 'stale', to = 'fetch' },
stale_to_stuck = { name = 'stale_to_stuck', from = 'stale', to = 'stuck' },
stuck_to_fetch = { name = 'stuck_to_fetch', from = 'stuck', to = 'fetch' },
},
}
-- Always start with 'fetch' state
function demuxer_cache.reset_state()
demuxer_cache.state = {
name = demuxer_cache.events.continue_fetch.to,
demuxer_cache_time = 0,
in_state_time = 0,
}
end
-- Has 'demuxer_cache_time' changed
function demuxer_cache.has_progress_since(t)
return demuxer_cache.state.demuxer_cache_time ~= t
end
function demuxer_cache.is_state_fetch()
return demuxer_cache.state.name == demuxer_cache.events.continue_fetch.to
end
function demuxer_cache.is_state_stale()
return demuxer_cache.state.name == demuxer_cache.events.continue_stale.to
end
function demuxer_cache.is_state_stuck()
return demuxer_cache.state.name == demuxer_cache.events.continue_stuck.to
end
function demuxer_cache.transition(event)
if demuxer_cache.state.name == event.from then
-- state setup
demuxer_cache.state.demuxer_cache_time = event.demuxer_cache_time
if event.name == 'continue_fetch' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stale' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'continue_stuck' then
demuxer_cache.state.in_state_time = demuxer_cache.state.in_state_time + event.interval
elseif event.name == 'fetch_to_stale' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_fetch' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stale_to_stuck' then
demuxer_cache.state.in_state_time = 0
elseif event.name == 'stuck_to_fetch' then
demuxer_cache.state.in_state_time = 0
end
-- state transition
demuxer_cache.state.name = event.to
msg.debug('demuxer_cache.transition', event.name, utils.to_string(demuxer_cache.state))
else
msg.error(
'demuxer_cache.transition',
'illegal transition', event.name,
'from state', demuxer_cache.state.name)
end
end
function demuxer_cache.initialize(demuxer_cache_timer_interval)
demuxer_cache.reset_state()
demuxer_cache.timer = mp.add_periodic_timer(
demuxer_cache_timer_interval,
function()
demuxer_cache.demuxer_cache_timer_tick(
mp.get_property_native('demuxer-cache-time'),
demuxer_cache_timer_interval)
end
)
end
-- If there is no progress of demuxer_cache_time in
-- settings.demuxer_cache_timer_timeout time interval switch state to
-- 'stuck' and switch back to 'fetch' as soon as any progress is made
function demuxer_cache.demuxer_cache_timer_tick(demuxer_cache_time, demuxer_cache_timer_interval)
local event = nil
local cache_has_progress = demuxer_cache.has_progress_since(demuxer_cache_time)
-- I miss pattern matching so much
if demuxer_cache.is_state_fetch() then
if cache_has_progress then
event = demuxer_cache.events.continue_fetch
else
event = demuxer_cache.events.fetch_to_stale
end
elseif demuxer_cache.is_state_stale() then
if cache_has_progress then
event = demuxer_cache.events.stale_to_fetch
elseif demuxer_cache.state.in_state_time < settings.demuxer_cache_timer_timeout then
event = demuxer_cache.events.continue_stale
else
event = demuxer_cache.events.stale_to_stuck
end
elseif demuxer_cache.is_state_stuck() then
if cache_has_progress then
event = demuxer_cache.events.stuck_to_fetch
else
event = demuxer_cache.events.continue_stuck
end
end
event.demuxer_cache_time = demuxer_cache_time
event.interval = demuxer_cache_timer_interval
demuxer_cache.transition(event)
end
local paused_for_cache = {
timer = nil,
time = 0,
}
function paused_for_cache.reset_timer()
msg.debug('paused_for_cache.reset_timer', paused_for_cache.time)
if paused_for_cache.timer then
paused_for_cache.timer:kill()
paused_for_cache.timer = nil
paused_for_cache.time = 0
end
end
function paused_for_cache.start_timer(interval_seconds, timeout_seconds)
msg.debug('paused_for_cache.start_timer', paused_for_cache.time)
if not paused_for_cache.timer then
paused_for_cache.timer = mp.add_periodic_timer(
interval_seconds,
function()
paused_for_cache.time = paused_for_cache.time + interval_seconds
if paused_for_cache.time >= timeout_seconds then
paused_for_cache.reset_timer()
reload_resume()
end
msg.debug('paused_for_cache', 'tick', paused_for_cache.time)
end
)
end
end
function paused_for_cache.handler(property, is_paused)
if is_paused then
if demuxer_cache.is_state_stuck() then
msg.info("demuxer cache has no progress")
-- reset demuxer state to avoid immediate reload if
-- paused_for_cache event triggered right after reload
demuxer_cache.reset_state()
reload_resume()
end
paused_for_cache.start_timer(
settings.paused_for_cache_timer_interval,
settings.paused_for_cache_timer_timeout)
else
paused_for_cache.reset_timer()
end
end
function read_settings()
options.read_options(settings, mp.get_script_name())
msg.debug(utils.to_string(settings))
end
function reload(path, time_pos)
msg.debug("reload", path, time_pos)
if time_pos == nil then
mp.commandv("loadfile", path, "replace")
else
mp.commandv("loadfile", path, "replace", "start=+" .. time_pos)
end
end
function reload_resume()
local path = mp.get_property("path", property_path)
local time_pos = mp.get_property("time-pos")
local reload_duration = mp.get_property_native("duration")
local playlist_count = mp.get_property_number("playlist/count")
local playlist_pos = mp.get_property_number("playlist-pos")
local playlist = {}
for i = 0, playlist_count-1 do
playlist[i] = mp.get_property("playlist/" .. i .. "/filename")
end
-- 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
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
-- VODs get stuck when reload is called without a time_pos
-- this is most noticeable in youtube videos whenever download gets stuck in the first frames
-- video would stay paused without being actually paused
-- issue surfaced in mpv 0.33, afaik
elseif reload_duration and reload_duration == 0 then
msg.info("reloading video from", time_pos, "second")
reload(path, time_pos)
else
msg.info("reloading stream")
reload(path, nil)
end
msg.info("file ", playlist_pos+1, "of", playlist_count, "in playlist")
for i = 0, playlist_pos-1 do
mp.commandv("loadfile", playlist[i], "append")
end
mp.commandv("playlist-move", 0, playlist_pos+1)
for i = playlist_pos+1, playlist_count-1 do
mp.commandv("loadfile", playlist[i], "append")
end
end
function reload_eof(property, eof_reached)
msg.debug("reload_eof", property, eof_reached)
local time_pos = mp.get_property_number("time-pos")
local duration = mp.get_property_number("duration")
if eof_reached and math.floor(time_pos) == math.floor(duration) then
msg.debug("property_time_pos", property_time_pos, "time_pos", time_pos)
-- Check that playback time_pos made progress after the last reload. When
-- eof is reached we try to reload video, in case there is more content
-- available. If time_pos stayed the same after reload, it means that vidkk
-- to avoid infinite reload loop when playback ended
-- math.floor function rounds time_pos to a second, to avoid inane reloads
if math.floor(property_time_pos) == math.floor(time_pos) then
msg.info("eof reached, playback ended")
mp.set_property("keep-open", property_keep_open)
else
msg.info("eof reached, checking if more content available")
reload_resume()
mp.set_property_bool("pause", false)
property_time_pos = time_pos
end
end
end
function on_file_loaded(event)
local debug_info = {
event = event,
time_pos = mp.get_property("time-pos"),
stream_pos = mp.get_property("stream-pos"),
stream_end = mp.get_property("stream-end"),
duration = mp.get_property("duration"),
seekable = mp.get_property("seekable"),
pause = mp.get_property("pause"),
paused_for_cache = mp.get_property("paused-for-cache"),
cache_buffering_state = mp.get_property("cache-buffering-state"),
}
msg.debug("debug_info", utils.to_string(debug_info))
-- When the video is reloaded after being paused for cache, it won't start
-- playing again while all properties looks fine:
-- `pause=no`, `paused-for-cache=no` and `cache-buffering-state=100`.
-- As a workaround, we cycle through the paused state by sending two SPACE
-- keypresses.
-- What didn't work:
-- - Cycling through the `pause` property.
-- - Run the `playlist-play-index current` command.
mp.commandv("keypress", 'SPACE')
mp.commandv("keypress", 'SPACE')
end
-- main
read_settings()
if settings.reload_key_binding ~= "" then
mp.add_key_binding(settings.reload_key_binding, "reload_resume", reload_resume)
end
if settings.paused_for_cache_timer_enabled then
mp.observe_property("paused-for-cache", "bool", paused_for_cache.handler)
end
if settings.demuxer_cache_timer_enabled then
demuxer_cache.initialize(settings.demuxer_cache_timer_interval)
end
if settings.reload_eof_enabled then
-- vo-configured == video output created && its configuration went ok
mp.observe_property(
"vo-configured",
"bool",
function(name, vo_configured)
msg.debug(name, vo_configured)
if vo_configured then
property_path = mp.get_property("path")
property_keep_open = mp.get_property("keep-open")
mp.set_property("keep-open", "yes")
mp.set_property("keep-open-pause", "no")
end
end
)
mp.observe_property("eof-reached", "bool", reload_eof)
end
mp.register_event("file-loaded", on_file_loaded)

View File

@@ -0,0 +1,5 @@
if grep -q "Arch Linux" /etc/os-release
function bat --wraps=glow --description 'alias bat glow'
glow $argv
end
end

View File

@@ -0,0 +1,9 @@
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
if grep -q "Arch Linux" /etc/os-release
function cat --wraps=glow --description 'alias cat glow'
glow $argv
end
end

View File

@@ -0,0 +1,3 @@
function deployments
rpm-ostree status $argv
end

View File

@@ -0,0 +1,7 @@
function fish_greeting
fastfetch -c ~/.config/fastfetch/startup.jsonc
## atuin
if grep -q "Arch Linux" /etc/os-release
atuin init fish | source
end
end

View File

@@ -0,0 +1,4 @@
function m4a --description 'alias m4a yt-dlp -x --audio-format m4a'
yt-dlp -x --audio-format m4a $argv
end

View File

@@ -0,0 +1,3 @@
function pin-deployment
sudo ostree admin pin $argv
end

View File

@@ -0,0 +1,3 @@
function remove-deployment
sudo ostree admin undeploy $argv
end

View File

@@ -0,0 +1,3 @@
function unpin-deployment
sudo ostree admin pin -u $argv
end

View File

@@ -0,0 +1,5 @@
-N 5
--embed-thumbnail
--embed-metadata
--cookies-from-browser firefox
-o ~/Downloads/%(fulltitle)s.%(ext)s

View File

@@ -0,0 +1,7 @@
--ozone-platform-hint=auto
--enable-gpu-rasterization
--ignore-gpu-blocklist
--enable-zero-copy
--use-gl=angle
--use-angle=vulkan
--enable-features=Vulkan,DefaultANGLEVulkan,VulkanFromANGLE,VaapiVideoDecodeLinuxGL,VaapiIgnoreDriverChecks,VaapiVideoEncoder,VaapiVideoDecoder

View File

@@ -0,0 +1,221 @@
# Include any additional configuration file(s)
# [include] sections are processed in the order you write them
# Files in $CONFIG_DIR/topgrade.d/ are automatically included before this file
[include]
# paths = ["/etc/topgrade.toml"]
[misc]
# Run `sudo -v` to cache credentials at the start of the run
# This avoids a blocking password prompt in the middle of an unattended run
# (default: false)
# pre_sudo = false
# Sudo command to be used
# sudo_command = "sudo"
# Disable specific steps - same options as the command line flag
disable = ["system", "containers"]
# Ignore failures for these steps
# ignore_failures = ["toolbx", "distrobox"]
# List of remote machines with Topgrade installed on them
# remote_topgrades = ["toothless", "pi", "parnas"]
# Path to Topgrade executable on remote machines
# remote_topgrade_path = ".cargo/bin/topgrade"
# Arguments to pass to SSH when upgrading remote systems
# ssh_arguments = "-o ConnectTimeout=2"
# Arguments to pass tmux when pulling Repositories
# tmux_arguments = "-S /var/tmux.sock"
# Do not set the terminal title (default: true)
# set_title = true
# Display the time in step titles (default: true)
# display_time = true
# Don't ask for confirmations (no default value)
assume_yes = true
# Do not ask to retry failed steps (default: false)
# no_retry = true
# Run inside tmux (default: false)
# run_in_tmux = true
# Cleanup temporary or old files (default: false)
cleanup = true
# Send a notification for every step (default: false)
# notify_each_step = false
# Skip sending a notification at the end of a run (default: false)
# skip_notify = true
# The Bash-it branch to update (default: "stable")
# bashit_branch = "stable"
# Run specific steps - same options as the command line flag
# only = ["system", "emacs"]
# Whether to self update
#
# this will be ignored if the binary is built without self update support
#
# available also via setting the environment variable TOPGRADE_NO_SELF_UPGRADE)
# no_self_update = true
# Extra tracing filter directives
# These are prepended to the `--log-filter` argument
# See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/filter/struct.EnvFilter.html#directives
# log_filters = ["topgrade::command=debug", "warn"]
# Commands to run before anything
[pre_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Commands to run after anything
[post_commands]
# "Emacs Snapshot" = "rm -rf ~/.emacs.d/elpa.bak && cp -rl ~/.emacs.d/elpa ~/.emacs.d/elpa.bak"
# Custom commands
[commands]
# "Python Environment" = "~/dev/.env/bin/pip install -i https://pypi.python.org/simple -U --upgrade-strategy eager jupyter"
# "Custom command using interactive shell (unix)" = "-i vim_upgrade"
[python]
# enable_pip_review = true ###disabled by default
# enable_pip_review_local = true ###disabled by default
# enable_pipupgrade = true ###disabled by default
# pipupgrade_arguments = "-y -u --pip-path pip" ###disabled by default
[composer]
# self_update = true
[brew]
# For the BrewCask step
# If `Repo Cask Upgrade` exists, then use the `-a` option.
# Otherwise, use the `--greedy` option.
# greedy_cask = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewCask step
# If `Repo Cask Upgrade` does not exist, then use the `--greedy_latest` option.
# NOTE: the above entry `greedy_cask` contains this entry, though you can enable
# both of them, they won't clash with each other.
# greedy_latest = true
# For the BrewFormula step
# Execute `brew autoremove` after the step.
# autoremove = true
# For the BrewFormula step
# Upgrade formulae built from the HEAD branch; `brew upgrade --fetch-HEAD`
# fetch_head = true
[linux]
# Arch Package Manager to use.
# Allowed values:
# autodetect, aura, garuda_update, pacman, pamac, paru, pikaur, trizen, yay
# arch_package_manager = "pacman"
# Arguments to pass yay (or paru) when updating packages
# yay_arguments = "--nodevel"
# Arguments to pass dnf when updating packages
# dnf_arguments = "--refresh"
# aura_aur_arguments = "-kx"
# aura_pacman_arguments = ""
# garuda_update_arguments = ""
# show_arch_news = true
# trizen_arguments = "--devel"
# pikaur_arguments = ""
# pamac_arguments = "--no-devel"
# enable_tlmgr = true
# emerge_sync_flags = "-q"
# emerge_update_flags = "-uDNa --with-bdeps=y world"
# redhat_distro_sync = false
# suse_dup = false
# rpm_ostree = false
# nix_arguments = "--flake"
# nix_env_arguments = "--prebuilt-only"
# Extra Home Manager arguments
# home_manager_arguments = ["--flake", "file"]
[git]
# How many repos to pull at max in parallel
# max_concurrency = 5
# Additional git repositories to pull
repos = [
"$HOME/*/",
"$HOME/git/*/",
]
# Don't pull the predefined git repos
# pull_predefined = false
# Arguments to pass Git when pulling Repositories
# arguments = "--rebase --autostash"
[windows]
# Manually select Windows updates
# accept_all_updates = false
# open_remotes_in_new_terminal = true
# wsl_update_pre_release = true
# wsl_update_use_web_download = true
# Causes Topgrade to rename itself during the run to allow package managers
# to upgrade it. Use this only if you installed Topgrade by using a package
# manager such as Scoop or Cargo
# self_rename = true
[npm]
# Use sudo if the NPM directory isn't owned by the current user
# use_sudo = true
[yarn]
# Run `yarn global upgrade` with `sudo`
# use_sudo = true
[vim]
# For `vim-plug`, execute `PlugUpdate!` instead of `PlugUpdate`
# force_plug_update = true
[firmware]
# Offer to update firmware; if false just check for and display available updates
upgrade = false
[vagrant]
# Vagrant directories
# directories = []
# power on vagrant boxes if needed
# power_on = true
# Always suspend vagrant boxes instead of powering off
# always_suspend = true
[flatpak]
# Use sudo for updating the system-wide installation
# use_sudo = true
[distrobox]
use_root = false
# containers = ["archlinux-latest"]
[containers]
# Specify the containers to ignore while updating (Wildcard supported)
# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest", "docker.io*"]
[lensfun]
# If disabled, Topgrade invokes `lensfunupdatedata` without root priviledge,
# then the update will be only available to you. Otherwise, `sudo` is required,
# and the update will be installed system-wide, i.e., available to all users.
# (default: false)
# use_sudo = false

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
/usr/bin/just --justfile /usr/share/appends/00-master.just "${@}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run net.kuribo64.melonDS "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run net.kuribo64.melonDS
fi

View File

@@ -0,0 +1,19 @@
#!/usr/bin/env bash
IGNORE_MANUAL="wheel|root|sudo|nobody"
for manually_created_user in $(grep -E -e ".*:[1-3][[:digit:]]{3}:.*" "$1") ; do
# `grep` matched on a group with GID [1-3]000 or so
if [ ! -z "$(cut -f4 -d: <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1,3 -d: --output-delimiter="|" <<< "${manually_created_user}")|${IGNORE_MANUAL:-}"
for related_group in $(grep "$(cut -f1 -d: <<< ${manually_created_user})" "$1"); do
# Deduplicates matches for the same group/user
if [ "$(cut -f1 <<< "${related_group}")" == "$(cut -f1 <<< "${manually_created_user}")" ] ; then
continue
fi
IGNORE_MANUAL="$(cut -f1 -d: <<< "${related_group}")|${IGNORE_MANUAL:-}"
done
done
grep --no-filename -e "^g" /usr/lib/sysusers.d/*.conf | grep -v -E -e "${IGNORE_MANUAL}" | tr -s " " | cut -d" " -f2 | uniq | xargs -I{} sed -i "/{}/d" "${1}"

View File

@@ -0,0 +1,10 @@
#!/bin/bash
# Check if any arguments were passed to the script
if [ "$#" -gt 0 ]; then
# If arguments are passed, include them in the flatpak run command
flatpak run io.github.ryubing.Ryujinx "$@"
else
# If no arguments are passed, just run the flatpak without any file
flatpak run io.github.ryubing.Ryujinx
fi

View File

@@ -0,0 +1,27 @@
#!/bin/sh
export XDG_RUNTIME_DIR=/run/user/$(id -u)
if [ -z "$DBUS_SESSION_BUS_ADDRESS" ]; then
eval $(dbus-launch --sh-syntax)
fi
mutter --wayland &
MUTTER_PID=$!
sleep 5
export DISPLAY=:1
# Start Waydroid in the background
waydroid show-full-ui &
WAYDROID_PID=$!
# Wait for Waydroid exit event in the log
tail -f -n0 /var/lib/waydroid/waydroid.log | grep -m1 run_buffer
# Cleanup and logout
kill $WAYDROID_PID
kill $MUTTER_PID
# Use loginctl to end the session gracefully
loginctl terminate-session "$XDG_SESSION_ID"
exit 0

View File

@@ -0,0 +1,27 @@
#!/usr/bin/env bash
# Define directory & target filename
directory="$1"
filename="$2"
# Check if the filename already has .tar.zst; if not, append it
if [[ ! "$filename" =~ \.tar\.zst$ ]]; then
archive="$filename.tar.zst"
else
archive="$filename"
fi
# Make sure the directory exists
if [[ ! -d "$directory" ]]; then
echo "Directory '$directory' not found."
return 1
fi
# Create the archive with tar and pipe it to zstd
tar -cvf - "$directory" | zstd -9 -T0 -o "$archive"
# Check for errors during compression
if [[ $? -ne 0 ]]; then
echo "Error during compression."
return 1
fi

View File

@@ -0,0 +1,27 @@
# We have this script so that people using images with `nss-altfiles` (`/usr/lib/g{roup,shadow}`)
# do not break their systems when rebasing to an image without that
# This usually happens when using https://github.com/hhd-dev/rechunk then rebasing to an image without it.
# Please DO NOT remove this unless this is fully, completely obsolete.
# This is exactly what is making it break: https://github.com/ublue-os/legacy-rechunk/blob/1d2b0c2e99afbdc2eb06788ae28e157a88b03d70/1_prune.sh#L41-L47
# Users WILL experience black screens and systems will NOT boot if this script malfunctions. Please test this properly and always make sure this works
# Relevant issues:
# - https://github.com/bootc-dev/bootc/issues/1179#issuecomment-2708305926
# - https://github.com/ublue-os/main/issues/759
# - https://github.com/ublue-os/bluefin-lts/issues/918
# - https://github.com/ublue-os/image-template/issues/177
# - https://github.com/ublue-os/aurora/issues/1468
# - https://github.com/ublue-os/bluefin/issues/3852
# This got created on Tue, 16 Dec 2025 00:44:58 -0300
[Unit]
Description=Fix groups for Legacy rechunker
Wants=local-fs.target
After=local-fs.target
[Service]
Type=oneshot
ExecStart=rechunker-group-fix /etc/group
ExecStart=rechunker-group-fix /etc/gshadow
ExecStart=systemd-sysusers
[Install]
WantedBy=default.target multi-user.target

View File

@@ -0,0 +1,9 @@
[Unit]
Description=Topgrade update service
Wants=network-online.target
After=network-online.target
[Service]
Type=oneshot
ExecCondition=/bin/bash -c '[[ "$(busctl get-property org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Metered | cut -c 3-)" == @(2|4) ]]'
ExecStart=/usr/bin/topgrade --no-retry --cleanup --yes

View File

@@ -0,0 +1,11 @@
[Unit]
Description=Topgrade update service timer
[Timer]
RandomizedDelaySec=5m
OnBootSec=2m
OnUnitActiveSec=12h
Persistent=true
[Install]
WantedBy=timers.target

View File

@@ -0,0 +1 @@
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"

View File

@@ -0,0 +1 @@
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"

View File

@@ -0,0 +1,3 @@
#!/usr/bin/env bash
sudo waydroid container restart

View File

@@ -0,0 +1,9 @@
set allow-duplicate-recipes := true
set ignore-comments := true
import "/usr/share/appends/01-system.just"
import "/usr/share/appends/10-apps.just"
import? "/usr/share/appends/99-solarpowered-ex.just"
import? "/usr/share/appends/99-solarpowered.just"
import? "$HOME/.justfile"
import? "$HOME/Justfile"

View File

@@ -0,0 +1,124 @@
# Boot into this device's BIOS/UEFI screen
bios:
#!/usr/bin/bash
if [ -d /sys/firmware/efi ]; then
systemctl reboot --firmware-setup
else
echo "Rebooting to legacy BIOS from OS is not supported."
fi
# Regenerate GRUB config
regenerate-grub:
#!/usr/bin/env bash
if [ -d /sys/firmware/efi ]; then
sudo grub2-mkconfig -o /etc/grub2-efi.cfg
else
sudo grub2-mkconfig -o /etc/grub2.cfg
fi
# Check for local overrides
check-local-overrides:
#!/usr/bin/env bash
diff -r \
--suppress-common-lines \
--color="always" \
--exclude "passwd*" \
--exclude "group*" \
--exclude="subgid*" \
--exclude="subuid*" \
--exclude="machine-id" \
--exclude="adjtime" \
--exclude="fstab" \
--exclude="system-connections" \
--exclude="shadow*" \
--exclude="gshadow*" \
--exclude="ssh_host*" \
--exclude="cmdline" \
--exclude="crypttab" \
--exclude="hostname" \
--exclude="localtime" \
--exclude="locale*" \
--exclude="*lock" \
--exclude=".updated" \
--exclude="*LOCK" \
--exclude="vconsole*" \
--exclude="00-keyboard.conf" \
--exclude="grub" \
--exclude="system.control*" \
--exclude="cdi" \
--exclude="default.target" \
/usr/etc /etc 2>/dev/null | sed '/Binary\ files\ /d'
# Show changelog between deployments
changelogs:
rpm-ostree db diff --changelogs
# Clean up old up unused podman images, volumes, flatpak packages and rpm-ostree content
clean-system:
podman image prune -af
podman volume prune -f
flatpak uninstall --unused
rpm-ostree cleanup -bm
# Renew IP & flush DNS
reset-address:
sudo nmcli device disconnect enp4s0
sudo nmcli device connect enp4s0
sudo systemctl restart systemd-resolved
systemd-resolve --status
# Enable iwd, disable wpa_supplicant
enable-iwd:
#!/usr/bin/env bash
sudo systemctl disable --now wpa_supplicant
sudo systemctl mask wpa_supplicant
mkdir -Z /etc/NetworkManager/conf.d
sudo cat > /etc/NetworkManager/conf.d/iwd.conf <<EOF
[device]
wifi.backend=iwd
EOF
restorecon -R /etc/NetworkManager
sudo systemctl restart NetworkManager
# Disable iwd, reenable wpa_supplicant
disable-iwd:
sudo mv "/etc/NetworkManager/conf.d/iwd.conf" "/etc/NetworkManager/conf.d/iwd.conf.off"
sudo systemctl disable --now iwd
sudo systemctl unmask wpa_supplicant
sudo systemctl enable --now wpa_supplicant
sudo systemctl restart NetworkManager
# Disable Zram and enable Zswap. Requires reboot
enable-zswap: disable-zram
sudo rpm-ostree kargs --append-if-missing=zswap.enabled=1 --append-if-missing=zswap.compressor=lz4 --append-if-missing=zswap.max_pool_percent=25
echo "Zswap is enabled and changes will reflect upon reboot."
# Enable Zram and disable zswap. Requires reboot
disable-zswap: enable-zram
sudo rpm-ostree kargs --delete-if-present=zswap.enabled=1 --delete-if-present=zswap.compressor=lz4 --delete-if-present=zswap.max_pool_percent=25
echo "Zswap is disabled and changes will reflect upon reboot."
# Disable Zram. Requires reboot
disable-zram:
#!/usr/bin/env bash
if [[ -e /etc/systemd/zram-generator.conf ]]; then
sudo mv /etc/zram-generator.conf /etc/zram-generator.conf.bak
fi
sudo touch /etc/systemd/zram-generator.conf
if [[ -e /etc/udev/rules.d/30-zram.rules ]]; then
sudo mv /etc/udev/rules.d/30-zram.rules /etc/udev/rules.d/30-zram.rules.bak
fi
sudo touch /etc/udev/rules.d/30-zram.rules
sudo systemctl daemon-reload
sudo udevadm control --reload-rules
sudo udevadm trigger
echo "Zram is disabled and changes will reflect upon reboot."
# Enable Zram. Requires reboot
enable-zram:
sudo rm /etc/systemd/zram-generator.conf
sudo rm /etc/udev/rules.d/30-zram.rules
sudo systemctl daemon-reload
sudo udevadm control --reload-rules
sudo udevadm trigger
echo "Zram is enabled and changes will reflect upon reboot."

View File

@@ -0,0 +1,96 @@
# Setup box
box:
distrobox-assemble create --file https://raw.githubusercontent.com/askpng/box/refs/heads/main/box.ini
distrobox-start boxit
# set junction as default for browsers
setup-junction:
xdg-settings set default-web-browser re.sonny.Junction.desktop
# install flameshot and grant screenshot permission
setup-flameshot:
flatpak install --noninteractive --assumeyes org.flameshot.Flameshot
flatpak permission-set screenshot screenshot org.flameshot.Flameshot yes
# Scripts to initialize, configure, integrate & reset Waydroid
setup-waydroid:
#!/usr/bin/env bash
set -e
if [ "$OPTION" == "" ]; then
echo "${bold}Waydroid utilities${normal}"
PS3="Please select an option: "
select OPTION in "Initialize Waydroid" "Configure Waydroid" "Enable fake touch" "Set as Nicole" "Install APKCombo installer and Material Files" "Logs, clean version" "Reset Waydroid (also removes waydroid-related files from user folder)"; do
if [[ -n "$OPTION" ]]; then
break
else
echo "Invalid option, please try again."
fi
done
fi
if [[ "${OPTION,,}" =~ ^init ]]; then
echo "sudo systemctl enable --now waydroid-container.service"
sudo systemctl enable --now waydroid-container.service
echo "waydroid init -s VANILLA -c 'https://ota.waydro.id/system' -v 'https://ota.waydro.id/vendor'"
sudo waydroid init -s VANILLA -c 'https://ota.waydro.id/system' -v 'https://ota.waydro.id/vendor'
echo "sudo restorecon -R /var/lib/waydroid"
sudo restorecon -R /var/lib/waydroid
echo "cp /usr/share/applications/waydroid-container-restart.desktop ~/.local/share/applications"
cp /usr/share/applications/waydroid-container-restart.desktop ~/.local/share/applications
echo "Waydroid has been initialized. Before continuing, run 'waydroid session start' and ensure it is up and running well."
elif [[ "${OPTION,,}" =~ ^configure ]]; then
echo "git clone https://github.com/askpng/waydroid_script.git --depth 1 /tmp/waydroid_script"
git clone https://github.com/askpng/waydroid_script.git --depth 1 /tmp/waydroid_script
echo "python3 -m venv /tmp/waydroid_script/venv"
python3 -m venv /tmp/waydroid_script/venv
echo "source /tmp/waydroid_script/venv/bin/activate"
source /tmp/waydroid_script/venv/bin/activate
echo "sudo /tmp/waydroid_script/venv/bin/pip install -r /tmp/waydroid_script/requirements.txt"
sudo /tmp/waydroid_script/venv/bin/pip install -r /tmp/waydroid_script/requirements.txt
echo "/tmp/waydroid_script/venv/bin/python3 /tmp/waydroid_script/main.py"
sudo /tmp/waydroid_script/venv/bin/python3 /tmp/waydroid_script/main.py
echo "deactivate"
deactivate
echo "sudo rm -rf /tmp/waydroid_script"
sudo rm -rf /tmp/waydroid_script ~/.cache/waydroid_script
elif [[ "${OPTION,,}" =~ ^enable ]]; then
echo "Setting fake touch for Aniplex apps..."
waydroid prop set persist.waydroid.fake_touch "com.aniplex.*"
elif [[ "${OPTION,,}" =~ ^set ]]; then
echo "curl -L 'https://raw.githubusercontent.com/askpng/waydroid_script/refs/heads/main/scripts/nicole.sh' -o /tmp/nicole.sh"
curl -L 'https://raw.githubusercontent.com/askpng/waydroid_script/refs/heads/main/scripts/nicole.sh' -o /tmp/nicole.sh
echo "chmod +x /tmp/nicole.sh"
chmod +x /tmp/nicole.sh
echo "sudo bash -c /tmp/nicole.sh"
sudo bash -c /tmp/nicole.sh
echo "rm -f /tmp/nicole.sh"
rm -f /tmp/nicole.sh
elif [[ "${OPTION,,}" =~ ^install ]]; then
echo "Installing APKCombo Installer"
curl -L "https://static.apkflash.com/files/com.apkcombo.app/apkcombo-installer.apk" -o /tmp/apkcombo-installer.apk
waydroid app install /tmp/apkcombo-installer.apk
echo "Installing Material Files"
curl -L "https://f-droid.org/repo/me.zhanghai.android.files_39.apk" -o /tmp/material-files.apk
waydroid app install /tmp/material-files.apk
echo "Removing .APK files"
rm /tmp/apkcombo-installer.apk /tmp/material-files.apk
echo "Success!"
elif [[ "${OPTION,,}" =~ ^logs ]]; then
echo "Grabbing clean logs..."
sudo waydroid logcat | grep -vi controller | grep -vi mantis | grep -vi gamepad | grep -v lowmemorykiller | grep -v libprocessgroup
elif [[ "${OPTION,,}" =~ ^reset ]]; then
echo "Resetting Waydroid"
echo "bash -c 'sudo rm -rf /var/lib/waydroid /home/.waydroid ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid'"
bash -c 'sudo rm -rf /var/lib/waydroid /home/.waydroid ~/waydroid ~/.share/waydroid ~/.local/share/applications/*aydroid* ~/.local/share/waydroid'
echo "sudo systemctl disable --now waydroid-container.service"
sudo systemctl disable --now waydroid-container.service
echo "Waydroid has been reset! Re-initialize to get it back up and running."
fi

View File

@@ -0,0 +1,8 @@
[Desktop Entry]
Type=Application
Name=Force Restart Waydroid
Exec=pkexec /usr/libexec/waydroid-container-restart
Categories=X-WayDroid-App;
X-Purism-FormFactor=Workstation;Mobile;
Icon=waydroid
NoDisplay=false

View File

@@ -0,0 +1,5 @@
[Desktop Entry]
Name=WayDroid on Mutter
Comment=LineageOS in a container
Exec=/usr/bin/waydroid-session
Type=Application