mirror of
https://github.com/tumillanino/miasma-os.git
synced 2026-06-15 12:39:33 +00:00
kernel still breaking. updated name which may have been issue
This commit is contained in:
0
docs/solarpowered-main/files/shared/etc/.gitkeep
Normal file
0
docs/solarpowered-main/files/shared/etc/.gitkeep
Normal file
68
docs/solarpowered-main/files/shared/etc/distrobox.ini
Normal file
68
docs/solarpowered-main/files/shared/etc/distrobox.ini
Normal 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
|
||||
@@ -0,0 +1,4 @@
|
||||
container_always_pull="1"
|
||||
container_generate_entry=1
|
||||
container_manager="podman"
|
||||
non_interactive="1"
|
||||
7
docs/solarpowered-main/files/shared/etc/rpm-ostreed.conf
Normal file
7
docs/solarpowered-main/files/shared/etc/rpm-ostreed.conf
Normal 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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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---------------------------------
|
||||
@@ -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'))
|
||||
@@ -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)
|
||||
@@ -0,0 +1,5 @@
|
||||
if grep -q "Arch Linux" /etc/os-release
|
||||
function bat --wraps=glow --description 'alias bat glow'
|
||||
glow $argv
|
||||
end
|
||||
end
|
||||
@@ -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
|
||||
@@ -0,0 +1,3 @@
|
||||
function deployments
|
||||
rpm-ostree status $argv
|
||||
end
|
||||
@@ -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
|
||||
@@ -0,0 +1,4 @@
|
||||
function m4a --description 'alias m4a yt-dlp -x --audio-format m4a'
|
||||
yt-dlp -x --audio-format m4a $argv
|
||||
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function pin-deployment
|
||||
sudo ostree admin pin $argv
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function remove-deployment
|
||||
sudo ostree admin undeploy $argv
|
||||
end
|
||||
@@ -0,0 +1,3 @@
|
||||
function unpin-deployment
|
||||
sudo ostree admin pin -u $argv
|
||||
end
|
||||
@@ -0,0 +1,5 @@
|
||||
-N 5
|
||||
--embed-thumbnail
|
||||
--embed-metadata
|
||||
--cookies-from-browser firefox
|
||||
-o ~/Downloads/%(fulltitle)s.%(ext)s
|
||||
@@ -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
|
||||
221
docs/solarpowered-main/files/shared/etc/topgrade.toml
Normal file
221
docs/solarpowered-main/files/shared/etc/topgrade.toml
Normal 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 `lensfun‑update‑data` 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
|
||||
3
docs/solarpowered-main/files/shared/usr/bin/append
Executable file
3
docs/solarpowered-main/files/shared/usr/bin/append
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
/usr/bin/just --justfile /usr/share/appends/00-master.just "${@}"
|
||||
10
docs/solarpowered-main/files/shared/usr/bin/melonDS
Executable file
10
docs/solarpowered-main/files/shared/usr/bin/melonDS
Executable 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
|
||||
19
docs/solarpowered-main/files/shared/usr/bin/rechunker-group-fix
Executable file
19
docs/solarpowered-main/files/shared/usr/bin/rechunker-group-fix
Executable 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}"
|
||||
10
docs/solarpowered-main/files/shared/usr/bin/ryujinx
Executable file
10
docs/solarpowered-main/files/shared/usr/bin/ryujinx
Executable 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
|
||||
27
docs/solarpowered-main/files/shared/usr/bin/waydroid-session
Executable file
27
docs/solarpowered-main/files/shared/usr/bin/waydroid-session
Executable 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
|
||||
27
docs/solarpowered-main/files/shared/usr/bin/zstar
Executable file
27
docs/solarpowered-main/files/shared/usr/bin/zstar
Executable 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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,11 @@
|
||||
[Unit]
|
||||
Description=Topgrade update service timer
|
||||
|
||||
[Timer]
|
||||
RandomizedDelaySec=5m
|
||||
OnBootSec=2m
|
||||
OnUnitActiveSec=12h
|
||||
Persistent=true
|
||||
|
||||
[Install]
|
||||
WantedBy=timers.target
|
||||
@@ -0,0 +1 @@
|
||||
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{serial}=="*vial:f64c2b3c*", MODE="0660", GROUP="users", TAG+="uaccess", TAG+="udev-acl"
|
||||
@@ -0,0 +1 @@
|
||||
KERNEL=="hidraw*", SUBSYSTEM=="hidraw", MODE="0666", TAG+="uaccess", TAG+="udev-acl"
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
sudo waydroid container restart
|
||||
@@ -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"
|
||||
@@ -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."
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -0,0 +1,5 @@
|
||||
[Desktop Entry]
|
||||
Name=WayDroid on Mutter
|
||||
Comment=LineageOS in a container
|
||||
Exec=/usr/bin/waydroid-session
|
||||
Type=Application
|
||||
Reference in New Issue
Block a user