This commit is contained in:
2026-01-23 20:20:57 -06:00
parent 9d5e396152
commit 13c920fd32
37 changed files with 2312 additions and 107 deletions

View File

@@ -0,0 +1,2 @@
*/15 * * * * root command -v zfs-auto-snapshot > /dev/null || exit 0 ; zfs-auto-snapshot --quiet --syslog --label=frequent --keep=4 //

View File

@@ -0,0 +1,6 @@
#!/bin/sh
# Only call zfs-auto-snapshot if it's available
command -v zfs-auto-snapshot > /dev/null || exit 0
exec zfs-auto-snapshot --quiet --syslog --label=daily --keep=31 //

View File

@@ -0,0 +1,6 @@
#!/bin/sh
#only call if script is there
command -v /home/aiden/sddm-random-background.sh >/dev/null || exit 0
exec /home/aiden/sddm-random-background.sh

View File

@@ -0,0 +1,6 @@
#!/bin/sh
# Only call zfs-auto-snapshot if it's available
command -v zfs-auto-snapshot > /dev/null || exit 0
exec zfs-auto-snapshot --quiet --syslog --label=hourly --keep=24 //

View File

@@ -0,0 +1,6 @@
#!/bin/sh
# Only call zfs-auto-snapshot if it's available
command -v zfs-auto-snapshot > /dev/null || exit 0
exec zfs-auto-snapshot --quiet --syslog --label=monthly --keep=12 //

View File

@@ -0,0 +1,6 @@
#!/bin/sh
# Only call zfs-auto-snapshot if it's available
command -v zfs-auto-snapshot > /dev/null || exit 0
exec zfs-auto-snapshot --quiet --syslog --label=weekly --keep=8 //

View File

@@ -13,12 +13,12 @@ layout {
}
shadow {
color "#00000070"
color "#11111b70"
}
tab-indicator {
active-color "#cba6f7"
inactive-color "#460594"
inactive-color "#6b02e9"
urgent-color "#f38ba8"
}
@@ -26,3 +26,10 @@ layout {
color "#cba6f780"
}
}
recent-windows {
highlight {
active-color "#cba6f7"
urgent-color "#f38ba8"
}
}

View File

@@ -13,18 +13,23 @@ spawn-at-startup "/usr/bin/swayidle" "-w"
workspace "chat" {
open-on-output "DP-3"
}
window-rule {
match app-id="nheko"
open-on-workspace "chat"
}
spawn-at-startup "/usr/bin/flatpak" "run" "im.nheko.Nheko"
window-rule {
match app-id="Element"
open-on-workspace "chat"
}
spawn-at-startup "/usr/bin/element-desktop"
//spawn-at-startup "/usr/bin/element-desktop"
//"--enable-features=UseOzonePlatform" "--ozone-platform=wayland"
window-rule {
match app-id="discord"
open-on-workspace "chat"
}
//spawn-at-startup "/usr/bin/flatpak" "run" "--socket=wayland" "com.discordapp.Discord" "--enable-features=UseOzonePlatform" "--ozone-platform=wayland"
spawn-at-startup "/usr/local/bin/discord-delay.sh"
//spawn-at-startup "/usr/local/bin/discord-delay.sh"
//window-rule {
// match app-id="srain"
// open-on-workspace "chat"

View File

@@ -93,11 +93,11 @@ animations {
// enable transparency
window-rule {
match is-active=false
opacity 0.8 //inactive transparency
opacity 1.0 //inactive transparency
}
window-rule {
match is-active=true
opacity 0.95 //active transparency
opacity 1.0 //active transparency
}
window-rule {
draw-border-with-background false

View File

@@ -1,3 +1,3 @@
#auth sufficient pam_fprintd.so max-tries=1
# only uncomment this if you have a fingerprint reader
auth sufficient pam_fprintd.so timeout=-1
auth sufficient /run/current-system/sw/lib/security/pam_fprintd.so timeout=-1 # for NixOS
auth required pam_unix.so

View File

@@ -8,10 +8,16 @@
],
"states": {
"privacy-indicator": {
"enabled": true
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"screen-recorder": {
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
},
"update-count": {
"enabled": true
"enabled": true,
"sourceUrl": "https://github.com/noctalia-dev/noctalia-plugins"
}
},
"version": 1

View File

@@ -0,0 +1,83 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Services.UI
import qs.Services.System
import qs.Widgets
NIconButton {
id: root
property var pluginApi: null
property ShellScreen screen
property string widgetId: ""
property string section: ""
readonly property var mainInstance: pluginApi?.mainInstance
enabled: mainInstance?.isAvailable ?? false
icon: "camera-video"
tooltipText: mainInstance?.buildTooltip()
tooltipDirection: BarService.getTooltipDirection()
baseSize: Style.capsuleHeight
applyUiScale: false
customRadius: Style.radiusL
colorBg: mainInstance?.isRecording ? Color.mPrimary : Style.capsuleColor
colorFg: mainInstance?.isRecording ? Color.mOnPrimary : Color.mOnSurface
colorBorder: "transparent"
colorBorderHover: "transparent"
border.color: Style.capsuleBorderColor
border.width: Style.capsuleBorderWidth
onClicked: {
if (!enabled) {
ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc"))
return
}
if (mainInstance) {
mainInstance.toggleRecording()
if (!mainInstance.isRecording && !mainInstance.isPending) {
// Recording was stopped, close control center if open
var controlCenter = PanelService.getPanel("controlCenterPanel", screen)
if (controlCenter) {
controlCenter.close()
}
}
}
}
onRightClicked: {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.showContextMenu(contextMenu);
contextMenu.openAtItem(root, screen);
}
}
NPopupContextMenu {
id: contextMenu
model: [
{
"label": I18n.tr("actions.widget-settings"),
"action": "widget-settings",
"icon": "settings"
},
]
onTriggered: action => {
var popupMenuWindow = PanelService.getPopupMenuWindow(screen);
if (popupMenuWindow) {
popupMenuWindow.close();
}
if (action === "widget-settings") {
BarService.openPluginSettings(screen, pluginApi.manifest);
}
}
}
}

View File

@@ -0,0 +1,22 @@
import QtQuick
import Quickshell
import qs.Widgets
import qs.Commons
NIconButton {
property ShellScreen screen
property var pluginApi: null
readonly property var mainInstance: pluginApi?.mainInstance
enabled: mainInstance?.isAvailable ?? false
icon: "camera-video"
tooltipText: mainInstance?.buildTooltip()
colorFg: mainInstance?.isRecording ? Color.mOnPrimary : Color.mPrimary
colorBg: mainInstance?.isRecording ? Color.mPrimary : Style.capsuleColor
onClicked: {
if (pluginApi && pluginApi.mainInstance) {
pluginApi.mainInstance.toggleRecording();
}
}
}

View File

@@ -0,0 +1,417 @@
import QtQuick
import Quickshell
import Quickshell.Io
import qs.Commons
import qs.Services.UI
import qs.Services.System
Item {
id: root
property var pluginApi: null
property bool isRecording: false
property bool isPending: false
property bool hasActiveRecording: false
property string outputPath: ""
property bool isAvailable: false
// Single reusable Process object
Process {
id: checker
running: true
command: ["sh", "-c", "command -v gpu-screen-recorder >/dev/null 2>&1 || (command -v flatpak >/dev/null 2>&1 && flatpak list --app | grep -q 'com.dec05eba.gpu_screen_recorder')"]
onExited: function (exitCode) {
isAvailable = (exitCode === 0);
running = false;
}
stdout: StdioCollector {}
stderr: StdioCollector {}
}
IpcHandler {
target: "plugin:screen-recorder"
function toggle() {
if (root.isAvailable) {
root.toggleRecording()
}
}
function start() {
if (root.isAvailable && !root.isRecording && !root.isPending) {
root.startRecording()
}
}
function stop() {
if (root.isRecording || root.isPending) {
root.stopRecording()
}
}
}
// Settings shortcuts
readonly property string directory: pluginApi?.pluginSettings?.directory || ""
readonly property string filenamePattern: pluginApi?.pluginSettings?.filenamePattern || "recording_yyyyMMdd_HHmmss"
readonly property string frameRate: pluginApi?.pluginSettings?.frameRate || "60"
readonly property string audioCodec: pluginApi?.pluginSettings?.audioCodec || "opus"
readonly property string videoCodec: pluginApi?.pluginSettings?.videoCodec || "h264"
readonly property string quality: pluginApi?.pluginSettings?.quality || "very_high"
readonly property string colorRange: pluginApi?.pluginSettings?.colorRange || "limited"
readonly property bool showCursor: pluginApi?.pluginSettings?.showCursor ?? true
readonly property bool copyToClipboard: pluginApi?.pluginSettings?.copyToClipboard ?? false
readonly property string audioSource: pluginApi?.pluginSettings?.audioSource || "default_output"
readonly property string videoSource: pluginApi?.pluginSettings?.videoSource || "portal"
readonly property string resolution: pluginApi?.pluginSettings?.resolution || "original"
function buildTooltip() {
if (!isAvailable) {
return pluginApi.tr("messages.not-installed")
}
if (isPending) {
pluginApi.tr("messages.started")
}
if (isRecording) {
return pluginApi.tr("messages.stop-recording")
}
return pluginApi.tr("messages.start-recording")
}
// Start or Stop recording
function toggleRecording() {
(isRecording || isPending) ? stopRecording() : startRecording()
}
// Open recording file
function openFile(path) {
if (!path) {
return
}
Quickshell.execDetached(["xdg-open", path])
}
// Copy file to clipboard as file reference
function copyFileToClipboard(filePath) {
if (!filePath) {
return
}
// Convert path to file:// URI format for copying as file reference
const fileUri = "file://" + filePath.replace(/ /g, "%20").replace(/'/g, "%27").replace(/"/g, "%22")
const escapedUri = fileUri.replace(/'/g, "'\\''")
const command = "printf '%s' '" + escapedUri + "' | wl-copy --type text/uri-list"
copyToClipboardProcess.exec({
"command": ["sh", "-c", command]
})
}
// Start screen recording
function startRecording() {
if (!isAvailable) {
return
}
if (isRecording || isPending) {
return
}
isPending = true
hasActiveRecording = false
// Close any opened panel
if ((PanelService.openedPanel !== null) && !PanelService.openedPanel.isClosing) {
PanelService.openedPanel.close()
}
// First, ensure xdg-desktop-portal and a compositor portal are running
portalCheckProcess.exec({
"command": ["sh", "-c",
"pidof xdg-desktop-portal >/dev/null 2>&1 && (pidof xdg-desktop-portal-wlr >/dev/null 2>&1 || pidof xdg-desktop-portal-hyprland >/dev/null 2>&1 || pidof xdg-desktop-portal-gnome >/dev/null 2>&1 || pidof xdg-desktop-portal-kde >/dev/null 2>&1)"]
})
}
function expandFilenamePattern(pattern) {
var now = new Date()
// Known Qt date/time format tokens sorted by length (longest first to match greedily)
var tokens = ['unix', 'MMMM', 'dddd', 'yyyy', 'MMM', 'ddd', 'zzz', 'HH', 'hh', 'mm', 'ss',
'yy', 'MM', 'dd', 'AP', 'ap', 'M', 'd', 'H', 'h', 'm', 's', 'z', 'A', 'a', 't'];
// Escape literal text by wrapping non-token sequences in single quotes
var escaped = "";
var i = 0;
var literalBuffer = "";
while (i < pattern.length) {
var matched = false;
// Try to match each token at current position (longest first)
for (var j = 0; j < tokens.length; j++) {
var token = tokens[j];
if (pattern.substr(i, token.length) === token) {
// Check if this is a single-letter token that might be part of a word
// Only match single letters if they're preceded/followed by non-letter or another token
if (token.length === 1) {
var prevChar = i > 0 ? pattern[i - 1] : "";
var nextChar = i + 1 < pattern.length ? pattern[i + 1] : "";
// If surrounded by letters, it's probably part of a word, not a token
if ((prevChar.match(/[a-zA-Z]/) || nextChar.match(/[a-zA-Z]/))) {
continue; // Skip this token match, treat as literal
}
}
// Flush any accumulated literal text
if (literalBuffer) {
escaped += "'" + literalBuffer + "'";
literalBuffer = "";
}
if (token === 'unix') {
// Replace 'unix' token with the actual timestamp literal
// Do not wrap in quotes to avoid creating '' sequences which are interpreted as escaped quotes
escaped += Math.floor(now.getTime() / 1000);
} else {
// Add other tokens as-is
escaped += token;
}
i += token.length;
matched = true;
break;
}
}
if (!matched) {
// Character is not part of a token, add to literal buffer
literalBuffer += pattern[i];
i++;
}
}
// Flush any remaining literal text
if (literalBuffer) {
escaped += "'" + literalBuffer + "'";
}
// Use Qt's I18n.locale.toString for proper date/time formatting
var expanded = I18n.locale.toString(now, escaped)
return expanded + ".mp4"
}
function launchRecorder() {
var pattern = filenamePattern || "recording_yyyyMMdd_HHmmss"
var filename = expandFilenamePattern(pattern)
var videoDir = Settings.preprocessPath(directory)
if (!videoDir) {
videoDir = Quickshell.env("HOME") + "/Videos"
}
if (videoDir && !videoDir.endsWith("/")) {
videoDir += "/"
}
outputPath = videoDir + filename
const audioFlags = (() => {
if (audioSource === "none") {
return ""
}
if (audioSource === "both") {
return `-ac ${audioCodec} -a "default_output|default_input"`
}
return `-ac ${audioCodec} -a ${audioSource}`
})()
var resolutionFlag = (resolution !== "original") ? `-s ${resolution}` : ""
var flags = `-w ${videoSource} -f ${frameRate} -k ${videoCodec} ${audioFlags} -q ${quality} -cursor ${showCursor ? "yes" : "no"} -cr ${colorRange} ${resolutionFlag} -o "${outputPath}"`
var command = `
_gpuscreenrecorder_flatpak_installed() {
flatpak list --app | grep -q "com.dec05eba.gpu_screen_recorder"
}
if command -v gpu-screen-recorder >/dev/null 2>&1; then
gpu-screen-recorder ${flags}
elif command -v flatpak >/dev/null 2>&1 && _gpuscreenrecorder_flatpak_installed; then
flatpak run --command=gpu-screen-recorder --file-forwarding com.dec05eba.gpu_screen_recorder ${flags}
else
echo "GPU_SCREEN_RECORDER_NOT_INSTALLED"
fi`
// Use Process to monitor it and read stderr
recorderProcess.exec({
"command": ["sh", "-c", command]
})
// Start monitoring - if process ends quickly, it was likely cancelled
pendingTimer.running = true
}
// Stop recording
function stopRecording() {
if (!isRecording && !isPending) {
return
}
ToastService.showNotice(pluginApi.tr("messages.stopping"), outputPath, "video")
Quickshell.execDetached(["sh", "-c", "pkill -SIGINT -f 'gpu-screen-recorder' || pkill -SIGINT -f 'com.dec05eba.gpu_screen_recorder'"])
isRecording = false
isPending = false
pendingTimer.running = false
monitorTimer.running = false
hasActiveRecording = false
// Just in case, force kill after 3 seconds
killTimer.running = true
}
// Helper function to truncate text for toast display
function truncateForToast(text, maxLength = 128) {
if (text.length <= maxLength) return text
return text.substring(0, maxLength) + "…"
}
// Helper function to check if output indicates user cancellation
function isCancelledByUser(stdoutText, stderrText) {
const stdout = String(stdoutText || "").toLowerCase()
const stderr = String(stderrText || "").toLowerCase()
const combined = stdout + " " + stderr
return combined.includes("canceled by") || combined.includes("cancelled by") ||
combined.includes("canceled by user") || combined.includes("cancelled by user") ||
combined.includes("canceled by the user") || combined.includes("cancelled by the user")
}
// Process to run and monitor gpu-screen-recorder
Process {
id: recorderProcess
stdout: StdioCollector {}
stderr: StdioCollector {}
onExited: function (exitCode, exitStatus) {
const stdout = String(recorderProcess.stdout.text || "").trim()
const stderr = String(recorderProcess.stderr.text || "").trim()
const wasCancelled = isCancelledByUser(stdout, stderr)
if (isPending) {
// Process ended while we were pending - likely cancelled or error
isPending = false
pendingTimer.running = false
// Check if gpu-screen-recorder is not installed
if (stdout === "GPU_SCREEN_RECORDER_NOT_INSTALLED") {
ToastService.showError(pluginApi.tr("messages.not-installed"), pluginApi.tr("messages.not-installed-desc"))
return
}
// If it failed to start, show a clear error toast with stderr
// But don't show error if user intentionally cancelled via portal
if (exitCode !== 0) {
if (stderr.length > 0 && !wasCancelled) {
ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr))
Logger.e("ScreenRecorder", stderr)
}
}
} else if (isRecording || hasActiveRecording) {
// Process ended normally while recording
isRecording = false
monitorTimer.running = false
if (exitCode === 0) {
// ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video")
ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath))
if (copyToClipboard) {
copyFileToClipboard(outputPath)
}
} else {
// Don't show error if user intentionally cancelled
if (!wasCancelled) {
if (stderr.length > 0) {
ToastService.showError(pluginApi.tr("messages.failed-start"), truncateForToast(stderr))
Logger.e("ScreenRecorder", stderr)
} else {
ToastService.showError(pluginApi.tr("messages.failed-start"), pluginApi.tr("messages.failed-general"))
}
}
}
hasActiveRecording = false
} else if (!isPending && exitCode === 0 && outputPath) {
// Fallback: if process exited successfully with an outputPath, handle it
// ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video")
ToastService.showNotice(pluginApi.tr("messages.saved"), outputPath, "video", 3000, pluginApi.tr("messages.open-file"), () => openFile(outputPath))
if (copyToClipboard) {
copyFileToClipboard(outputPath)
}
}
}
}
// Pre-flight check for xdg-desktop-portal
Process {
id: portalCheckProcess
onExited: function (exitCode, exitStatus) {
if (exitCode === 0) {
// Portals available, proceed to launch
launchRecorder()
} else {
isPending = false
hasActiveRecording = false
ToastService.showError(pluginApi.tr("messages.no-portals"), pluginApi.tr("messages.no-portals-desc"))
}
}
}
// Process to copy file to clipboard
Process {
id: copyToClipboardProcess
onExited: function (exitCode, exitStatus) {
if (exitCode !== 0) {
Logger.e("ScreenRecorder", "Failed to copy file to clipboard, exit code:", exitCode)
}
}
}
Timer {
id: pendingTimer
interval: 2000 // Wait 2 seconds to see if process stays alive
running: false
repeat: false
onTriggered: {
if (isPending && recorderProcess.running) {
// Process is still running after 2 seconds - assume recording started successfully
isPending = false
isRecording = true
hasActiveRecording = true
monitorTimer.running = true
} else if (isPending) {
// Process not running anymore - was cancelled or failed
isPending = false
}
}
}
// Monitor timer to periodically check if we're still recording
Timer {
id: monitorTimer
interval: 2000
running: false
repeat: true
onTriggered: {
if (!recorderProcess.running && isRecording) {
isRecording = false
running = false
}
}
}
Timer {
id: killTimer
interval: 3000
running: false
repeat: false
onTriggered: {
Quickshell.execDetached(["sh", "-c", "pkill -9 -f 'gpu-screen-recorder' 2>/dev/null || pkill -9 -f 'com.dec05eba.gpu_screen_recorder' 2>/dev/null || true"])
}
}
}

View File

@@ -0,0 +1,124 @@
# Screen Recorder Plugin
Hardware-accelerated screen recording for Noctalia using [gpu-screen-recorder](https://git.dec05eba.com/gpu-screen-recorder/about/).
## Features
- Hardware-accelerated screen recording
- Customizable video codecs (H264, HEVC, AV1, VP8, VP9, HDR variants)
- Audio recording with multiple sources (system output, microphone, both, or none)
- Adjustable frame rates (30-240 FPS)
- Configurable output resolution (Full HD, 4K, QHD, HD, or original)
- Configurable output directory
- Optional clipboard copy after recording
- Optional cursor recording
- Multiple quality presets
## Requirements
- **gpu-screen-recorder** - The screen recording backend
- Install via package manager: `gpu-screen-recorder`
- **xdg-desktop-portal** and a compositor portal backend (wlr/hyprland/gnome etc)
## Installation
1. Copy this plugin to your Noctalia plugins directory:
```bash
cp -r screen-recorder ~/.config/noctalia/plugins/
```
2. Add the widget to your bar through Noctalia settings
## Usage
### Bar Widget
- **Left Click**: Start/stop recording
- **Right Click**: Open plugin settings
### Settings
Configure the plugin through the settings panel:
- **Output Folder**: Where recordings will be saved (defaults to `~/Videos`)
- **Filename Pattern**: Pattern for generated filenames. Supports standard Qt date format tokens (e.g., `yyyy`, `MM`, `dd` etc.) and `unix` for Unix timestamp.
- **Video Source**: Choose between Portal (recommended) or Screen
- **Frame Rate**: Target FPS (30, 60, 100, 120, 144, 165, 240)
- **Video Quality**: Medium, High, Very High, or Ultra
- **Video Codec**: H264, HEVC, AV1, VP8, VP9 (+ HDR variants for screen source)
- **Color Range**: Limited (recommended) or Full
- **Resolution**: Output resolution limit (1920x1080, 2560x1440, 3840x2160, 1280x720, or Original)
- **Audio Source**: None, System Output, Microphone, or Both
- **Audio Codec**: Opus (recommended) or AAC
- **Show Cursor**: Include mouse cursor in recording
- **Copy to Clipboard**: Automatically copy file after recording
### IPC Commands
Control the screen recorder via IPC for keybindings or scripts:
```bash
# Toggle recording on/off
qs -c noctalia-shell ipc call plugin:screen-recorder toggle
# Explicitly start recording
qs -c noctalia-shell ipc call plugin:screen-recorder start
# Explicitly stop recording
qs -c noctalia-shell ipc call plugin:screen-recorder stop
```
## Video Codecs
- **H264**: Most compatible, good quality, works everywhere
- **HEVC (H.265)**: Better compression than H264, smaller files
- **AV1**: Best compression, smallest files, newer codec
- **VP8/VP9**: Open-source alternatives
- **HDR variants**: Available when using "Screen" source for high dynamic range content
## Audio Sources
- **None**: No audio recording
- **System Output**: Capture system sounds (what you hear)
- **Microphone Input**: Capture from microphone
- **Both**: Record both system and microphone audio
## Troubleshooting
### "Screen recorder not installed" error
Install gpu-screen-recorder:
```bash
# Arch Linux
sudo pacman -S gpu-screen-recorder
# Or via Flatpak
flatpak install com.dec05eba.gpu_screen_recorder
```
### "Desktop portals not running" error
Ensure xdg-desktop-portal and a compositor portal are running:
```bash
# Check if portals are running
pidof xdg-desktop-portal
pidof xdg-desktop-portal-wlr # or -hyprland, -gnome, -kde
# Install if needed (example for Arch)
sudo pacman -S xdg-desktop-portal xdg-desktop-portal-wlr
```
### Recording fails with artifacts
Try changing the video source from "Portal" to "Screen" in settings.
### Recording stops immediately
- Check if the output directory exists and is writable
- Ensure gpu-screen-recorder has necessary permissions
- Check Noctalia logs for detailed error messages
## License
MIT License
## Credits
- Uses [gpu-screen-recorder](https://git.dec05eba.com/gpu-screen-recorder/about/) by dec05eba
- Part of the [Noctalia](https://github.com/noctalia-dev/noctalia-shell) plugin ecosystem

View File

@@ -0,0 +1,395 @@
import QtQuick
import QtQuick.Layouts
import Quickshell
import qs.Commons
import qs.Widgets
import qs.Services.UI
ColumnLayout {
id: root
spacing: Style.marginL
property var pluginApi: null
property string editDirectory:
pluginApi?.pluginSettings?.directory ||
pluginApi?.manifest?.metadata?.defaultSettings?.directory ||
""
property string editFilenamePattern:
pluginApi?.pluginSettings?.filenamePattern ||
pluginApi?.manifest?.metadata?.defaultSettings?.filenamePattern ||
"recording_yyyyMMdd_HHmmss"
property string editFrameRate:
pluginApi?.pluginSettings?.frameRate ||
pluginApi?.manifest?.metadata?.defaultSettings?.frameRate ||
"60"
property string editAudioCodec:
pluginApi?.pluginSettings?.audioCodec ||
pluginApi?.manifest?.metadata?.defaultSettings?.audioCodec ||
"opus"
property string editVideoCodec:
pluginApi?.pluginSettings?.videoCodec ||
pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec ||
"h264"
property string editQuality:
pluginApi?.pluginSettings?.quality ||
pluginApi?.manifest?.metadata?.defaultSettings?.quality ||
"very_high"
property string editColorRange:
pluginApi?.pluginSettings?.colorRange ||
pluginApi?.manifest?.metadata?.defaultSettings?.colorRange ||
"limited"
property bool editShowCursor:
pluginApi?.pluginSettings?.showCursor ??
pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ??
true
property bool editCopyToClipboard:
pluginApi?.pluginSettings?.copyToClipboard ??
pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ??
false
property string editAudioSource:
pluginApi?.pluginSettings?.audioSource ||
pluginApi?.manifest?.metadata?.defaultSettings?.audioSource ||
"default_output"
property string editVideoSource:
pluginApi?.pluginSettings?.videoSource ||
pluginApi?.manifest?.metadata?.defaultSettings?.videoSource ||
"portal"
property string editResolution:
pluginApi?.pluginSettings?.resolution ||
pluginApi?.manifest?.metadata?.defaultSettings?.resolution ||
"original"
function saveSettings() {
if (!pluginApi) {
Logger.e("ScreenRecorder", "Cannot save: pluginApi is null")
return
}
pluginApi.pluginSettings.directory = root.editDirectory
pluginApi.pluginSettings.filenamePattern = root.editFilenamePattern
pluginApi.pluginSettings.frameRate = root.editFrameRate
pluginApi.pluginSettings.audioCodec = root.editAudioCodec
pluginApi.pluginSettings.videoCodec = root.editVideoCodec
pluginApi.pluginSettings.quality = root.editQuality
pluginApi.pluginSettings.colorRange = root.editColorRange
pluginApi.pluginSettings.showCursor = root.editShowCursor
pluginApi.pluginSettings.copyToClipboard = root.editCopyToClipboard
pluginApi.pluginSettings.audioSource = root.editAudioSource
pluginApi.pluginSettings.videoSource = root.editVideoSource
pluginApi.pluginSettings.resolution = root.editResolution
pluginApi.saveSettings()
Logger.i("ScreenRecorder", "Settings saved successfully")
}
NTextInputButton {
label: pluginApi.tr("settings.general.output-folder")
description: pluginApi.tr("settings.general.output-folder-description")
placeholderText: Quickshell.env("HOME") + "/Videos"
text: root.editDirectory
buttonIcon: "folder-open"
buttonTooltip: pluginApi.tr("settings.general.output-folder")
onInputEditingFinished: root.editDirectory = text
onButtonClicked: folderPicker.openFilePicker()
}
// Filename Pattern
NTextInput {
label: pluginApi?.tr("settings.filename-pattern.label") || "Filename pattern"
description: pluginApi?.tr("settings.filename-pattern.description") || "Pattern for generated filenames. Supported: yyyy, yy, MM, M, dd, d, HH, H, mm, m, ss, s (e.g., mycool-recording_yyyyMMdd_HHmmss)"
placeholderText: "recording_yyyyMMdd_HHmmss"
text: root.editFilenamePattern
onTextChanged: root.editFilenamePattern = text
Layout.fillWidth: true
}
NDivider {
Layout.fillWidth: true
}
// Show Cursor
NToggle {
label: pluginApi.tr("settings.general.show-cursor")
description: pluginApi.tr("settings.general.show-cursor-description")
checked: root.editShowCursor
onToggled: root.editShowCursor = checked
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.showCursor ?? true
}
// Copy to Clipboard
NToggle {
label: pluginApi.tr("settings.general.copy-to-clipboard")
description: pluginApi.tr("settings.general.copy-to-clipboard-description")
checked: root.editCopyToClipboard
onToggled: root.editCopyToClipboard = checked
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.copyToClipboard ?? false
}
NDivider {
Layout.fillWidth: true
}
// Video Settings
ColumnLayout {
spacing: Style.marginL
Layout.fillWidth: true
// Source
NComboBox {
label: pluginApi.tr("settings.video.source")
description: pluginApi.tr("settings.video.source-desc")
model: [
{
"key": "portal",
"name": pluginApi.tr("settings.video.sources-portal")
},
{
"key": "screen",
"name": pluginApi.tr("settings.video.sources-screen")
}
]
currentKey: root.editVideoSource
onSelected: key => root.editVideoSource = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoSource || "portal"
}
// Frame Rate
NComboBox {
label: pluginApi.tr("settings.video.frame-rate")
description: pluginApi.tr("settings.video.frame-rate-desc")
model: [
{
"key": "30",
"name": "30 FPS"
},
{
"key": "60",
"name": "60 FPS"
},
{
"key": "100",
"name": "100 FPS"
},
{
"key": "120",
"name": "120 FPS"
},
{
"key": "144",
"name": "144 FPS"
},
{
"key": "165",
"name": "165 FPS"
},
{
"key": "240",
"name": "240 FPS"
}
]
currentKey: root.editFrameRate
onSelected: key => root.editFrameRate = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.frameRate || "60"
}
// Video Quality
NComboBox {
label: pluginApi.tr("settings.video.quality")
description: pluginApi.tr("settings.video.quality-desc")
model: [
{
"key": "medium",
"name": pluginApi.tr("settings.video.quality-medium")
},
{
"key": "high",
"name": pluginApi.tr("settings.video.quality-high")
},
{
"key": "very_high",
"name": pluginApi.tr("settings.video.quality-very-high")
},
{
"key": "ultra",
"name": pluginApi.tr("settings.video.quality-ultra")
}
]
currentKey: root.editQuality
onSelected: key => root.editQuality = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.quality || "very_high"
}
// Video Codec
NComboBox {
label: pluginApi.tr("settings.video.codec")
description: pluginApi.tr("settings.video.codec-desc")
model: {
let options = [
{"key": "h264", "name": "H264"},
{"key": "hevc", "name": "HEVC"},
{"key": "av1", "name": "AV1"},
{"key": "vp8", "name": "VP8"},
{"key": "vp9", "name": "VP9"}
]
// Only add HDR options if source is 'screen'
if (root.editVideoSource === "screen") {
options.push({"key": "hevc_hdr", "name": "HEVC HDR"})
options.push({"key": "av1_hdr", "name": "AV1 HDR"})
}
return options
}
currentKey: root.editVideoCodec
onSelected: key => {
root.editVideoCodec = key
// If an HDR codec is selected, change the colorRange to full
if (key.includes("_hdr")) {
root.editColorRange = "full"
}
}
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.videoCodec || "h264"
Connections {
target: root
function onEditVideoSourceChanged() {
if (root.editVideoSource !== "screen" && (root.editVideoCodec === "av1_hdr" || root.editVideoCodec === "hevc_hdr")) {
root.editVideoCodec = "h264"
}
}
}
}
// Color Range
NComboBox {
label: pluginApi.tr("settings.video.color-range")
description: pluginApi.tr("settings.video.color-range-desc")
model: [
{
"key": "limited",
"name": pluginApi.tr("settings.video.color-range-limited")
},
{
"key": "full",
"name": pluginApi.tr("settings.video.color-range-full")
}
]
currentKey: root.editColorRange
onSelected: key => root.editColorRange = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.colorRange || "limited"
}
// Resolution
NComboBox {
label: pluginApi.tr("settings.video.resolution")
description: pluginApi.tr("settings.video.resolution-desc")
model: [
{
"key": "original",
"name": pluginApi.tr("settings.video.resolution-original")
},
{
"key": "1920x1080",
"name": "1920x1080 (Full HD)"
},
{
"key": "2560x1440",
"name": "2560x1440 (QHD)"
},
{
"key": "3840x2160",
"name": "3840x2160 (4K)"
},
{
"key": "1280x720",
"name": "1280x720 (HD)"
}
]
currentKey: root.editResolution
onSelected: key => root.editResolution = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.resolution || "original"
}
}
NDivider {
Layout.fillWidth: true
}
// Audio Settings
ColumnLayout {
spacing: Style.marginL
Layout.fillWidth: true
// Audio Source
NComboBox {
label: pluginApi.tr("settings.audio.source")
description: pluginApi.tr("settings.audio.source-desc")
model: [
{
"key": "none",
"name": pluginApi.tr("settings.audio.audio-sources-none")
},
{
"key": "default_output",
"name": pluginApi.tr("settings.audio.audio-sources-system-output")
},
{
"key": "default_input",
"name": pluginApi.tr("settings.audio.audio-sources-microphone-input")
},
{
"key": "both",
"name": pluginApi.tr("settings.audio.audio-sources-both")
}
]
currentKey: root.editAudioSource
onSelected: key => root.editAudioSource = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.audioSource || "default_output"
}
// Audio Codec
NComboBox {
label: pluginApi.tr("settings.audio.codec")
description: pluginApi.tr("settings.audio.codec-desc")
model: [
{
"key": "opus",
"name": "Opus"
},
{
"key": "aac",
"name": "AAC"
}
]
currentKey: root.editAudioCodec
onSelected: key => root.editAudioCodec = key
defaultValue: pluginApi?.manifest?.metadata?.defaultSettings?.audioCodec || "opus"
}
}
Item {
Layout.fillHeight: true
}
NFilePicker {
id: folderPicker
selectionMode: "folders"
title: pluginApi.tr("settings.general.output-folder")
initialPath: root.editDirectory || Quickshell.env("HOME") + "/Videos"
onAccepted: paths => {
if (paths.length > 0) {
root.editDirectory = paths[0]
}
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Hardwarebeschleunigte Bildschirmaufnahme mit anpassbaren Video- und Audioeinstellungen",
"messages": {
"failed-general": "Der Recorder wurde mit einem Fehler beendet.",
"failed-gpu": "gpu-screen-recorder wurde unerwartet beendet.",
"failed-start": "Aufnahme konnte nicht gestartet werden.",
"no-portals": "Desktop-Portale laufen nicht.",
"no-portals-desc": "Starte xdg-desktop-portal und ein Compositor-Portal (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder ist nicht installiert.",
"not-installed-desc": "Bitte installieren Sie gpu-screen-recorder, um die Bildschirmaufzeichnungsfunktionen zu nutzen.",
"saved": "Aufnahme gespeichert.",
"start-recording": "Bildschirmaufnahme (Aufnahme starten)",
"started": "Aufnahme gestartet.",
"stop-recording": "Bildschirmaufnahme (Aufnahme stoppen)",
"stopping": "Aufnahme stoppen…"
},
"name": "Bildschirmrekorder",
"settings": {
"audio": {
"audio-sources-both": "Systemausgabe + Mikrofoneingang",
"audio-sources-microphone-input": "Mikrofoneingang",
"audio-sources-none": "Kein Audio",
"audio-sources-system-output": "Systemausgabe",
"codec": "Audio-Codec",
"codec-desc": "Opus wird für beste Leistung und kleinste Audiogröße empfohlen",
"source": "Audioquelle",
"source-desc": "Audioquelle, die während der Aufnahme aufgenommen werden soll",
"title": "Audioeinstellungen"
},
"filename-pattern": {
"description": "Dateimuster mit Datums-/Zeitcodes (z. B. aufnahme_yyyyMMdd_HHmmss)",
"label": "Dateimuster"
},
"general": {
"copy-to-clipboard": "In die Zwischenablage kopieren",
"copy-to-clipboard-description": "Kopiere die Datei nach Abschluss der Aufnahme in die Zwischenablage.",
"output-folder": "Ausgabeordner",
"output-folder-description": "Ordner, in dem Bildschirmaufnahmen gespeichert werden",
"show-cursor": "Cursor anzeigen",
"show-cursor-description": "Mauszeiger im Video aufnehmen",
"title": "Allgemein"
},
"title": "Bildschirmrekorder-Einstellungen",
"video": {
"codec": "Video-Codec",
"codec-desc": "h264 ist der gängigste Codec",
"color-range": "Farbbereich",
"color-range-desc": "Begrenzt wird für bessere Kompatibilität empfohlen",
"color-range-full": "Vollständig",
"color-range-limited": "Begrenzt",
"frame-rate": "Bildrate",
"frame-rate-desc": "Ziel-Bildrate für Bildschirmaufnahmen",
"quality": "Videoqualität",
"quality-desc": "Höhere Qualität führt zu größeren Dateien",
"quality-high": "Hoch",
"quality-medium": "Mittel",
"quality-ultra": "Ultra",
"quality-very-high": "Sehr hoch",
"resolution": "Auflösung",
"resolution-desc": "Ausgabeauflösung begrenzen. Standard verwendet Originalbildschirmauflösung",
"resolution-original": "Standard",
"source": "Videoquelle",
"source-desc": "Portal wird empfohlen, bei Artefakten versuchen Sie Bildschirm",
"sources-portal": "Portal",
"sources-screen": "Bildschirm",
"title": "Videoeinstellungen"
}
}
}

View File

@@ -0,0 +1,70 @@
{
"description": "Hardware-accelerated screen recording with customizable video and audio settings",
"messages": {
"failed-general": "Recorder exited with an error.",
"failed-gpu": "gpu-screen-recorder exited unexpectedly.",
"failed-start": "Failed to start recording.",
"no-portals": "Desktop portals not running.",
"no-portals-desc": "Start xdg-desktop-portal and a compositor portal (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder not installed.",
"not-installed-desc": "Please install gpu-screen-recorder to use screen recording features.",
"saved": "Recording saved.",
"start-recording": "Screen recorder (start recording)",
"started": "Recording started.",
"stop-recording": "Screen recorder (stop recording)",
"stopping": "Stopping recording…",
"open-file": "Open file"
},
"name": "Screen Recorder",
"settings": {
"audio": {
"audio-sources-both": "System output + microphone input",
"audio-sources-microphone-input": "Microphone input",
"audio-sources-none": "No audio",
"audio-sources-system-output": "System output",
"codec": "Audio codec",
"codec-desc": "Opus is recommended for best performance and smallest audio size",
"source": "Audio source",
"source-desc": "Audio source to capture during recording",
"title": "Audio Settings"
},
"filename-pattern": {
"description": "Filename pattern using date/time codes (e.g., recording_yyyyMMdd_HHmmss)",
"label": "Filename pattern"
},
"general": {
"copy-to-clipboard": "Copy to clipboard",
"copy-to-clipboard-description": "Copy the file to clipboard after recording finishes.",
"output-folder": "Output folder",
"output-folder-description": "Folder where screen recordings will be saved",
"show-cursor": "Show cursor",
"show-cursor-description": "Record mouse cursor in the video",
"title": "General"
},
"title": "Screen Recorder Settings",
"video": {
"codec": "Video codec",
"codec-desc": "h264 is the most common codec",
"color-range": "Color range",
"color-range-desc": "Limited is recommended for better compatibility",
"color-range-full": "Full",
"color-range-limited": "Limited",
"frame-rate": "Frame rate",
"frame-rate-desc": "Target frame rate for screen recordings",
"quality": "Video quality",
"quality-desc": "Higher quality results in larger file sizes",
"quality-high": "High",
"quality-medium": "Medium",
"quality-ultra": "Ultra",
"quality-very-high": "Very high",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Video source",
"source-desc": "Portal is recommended, if you get artifacts try Screen",
"sources-portal": "Portal",
"sources-screen": "Screen",
"title": "Video Settings"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Grabación de pantalla acelerada por hardware con configuración personalizable de video y audio",
"messages": {
"failed-general": "El grabador salió con un error.",
"failed-gpu": "gpu-screen-recorder se cerró inesperadamente.",
"failed-start": "No se pudo iniciar la grabación.",
"no-portals": "Portales de escritorio no están en ejecución.",
"no-portals-desc": "Inicia xdg-desktop-portal y un portal de compositor (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder no está instalado.",
"not-installed-desc": "Por favor, instale gpu-screen-recorder para usar las funciones de grabación de pantalla.",
"saved": "Grabación guardada.",
"start-recording": "Grabador de pantalla (empezar a grabar)",
"started": "Grabación iniciada.",
"stop-recording": "Grabador de pantalla (detener grabación)",
"stopping": "Deteniendo la grabación…"
},
"name": "Grabadora de Pantalla",
"settings": {
"audio": {
"audio-sources-both": "Salida del sistema + entrada de micrófono",
"audio-sources-microphone-input": "Entrada de micrófono",
"audio-sources-none": "Sin audio",
"audio-sources-system-output": "Salida del sistema",
"codec": "Códec de audio",
"codec-desc": "Opus se recomienda para mejor rendimiento y tamaño de audio más pequeño",
"source": "Fuente de audio",
"source-desc": "Fuente de audio para capturar durante la grabación",
"title": "Configuración de Audio"
},
"filename-pattern": {
"description": "Patrón de nombre de archivo usando códigos de fecha/hora (p. ej., recording_yyyyMMdd_HHmmss)",
"label": "Patrón de nombre de archivo"
},
"general": {
"copy-to-clipboard": "Copiar al portapapeles",
"copy-to-clipboard-description": "Copia el archivo al portapapeles después de que termine la grabación.",
"output-folder": "Carpeta de salida",
"output-folder-description": "Carpeta donde se guardarán las grabaciones de pantalla",
"show-cursor": "Mostrar cursor",
"show-cursor-description": "Grabar el cursor del ratón en el video",
"title": "General"
},
"title": "Configuración de Grabadora de Pantalla",
"video": {
"codec": "Códec de video",
"codec-desc": "h264 es el códec más común",
"color-range": "Rango de color",
"color-range-desc": "Limitado se recomienda para mejor compatibilidad",
"color-range-full": "Completo",
"color-range-limited": "Limitado",
"frame-rate": "Tasa de fotogramas",
"frame-rate-desc": "Tasa de fotogramas objetivo para grabaciones de pantalla",
"quality": "Calidad de video",
"quality-desc": "Mayor calidad resulta en archivos más grandes",
"quality-high": "Alto",
"quality-medium": "Mediano",
"quality-ultra": "Ultra",
"quality-very-high": "Muy alto",
"resolution": "Resolución",
"resolution-desc": "Limitar resolución de salida. Predeterminado usa resolución de pantalla original",
"resolution-original": "Default",
"source": "Fuente de video",
"source-desc": "Se recomienda Portal, si obtiene artefactos intente Pantalla",
"sources-portal": "Portal",
"sources-screen": "Pantalla",
"title": "Configuración de Video"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Enregistrement d'écran accéléré par matériel avec paramètres vidéo et audio personnalisables",
"messages": {
"failed-general": "L'enregistreur a quitté avec une erreur.",
"failed-gpu": "L'enregistreur d'écran GPU s'est arrêté de manière inattendue.",
"failed-start": "Échec du démarrage de l'enregistrement.",
"no-portals": "Les portails de bureau ne fonctionnent pas.",
"no-portals-desc": "Démarrer xdg-desktop-portal et un portail de compositeur (wlr/hyprland/gnome/kde).",
"not-installed": "enregistreur d'écran gpu non installé.",
"not-installed-desc": "Veuillez installer gpu-screen-recorder pour utiliser les fonctionnalités d'enregistrement d'écran.",
"saved": "Enregistrement sauvegardé.",
"start-recording": "Enregistreur d'écran (démarrer l'enregistrement)",
"started": "Enregistrement démarré.",
"stop-recording": "Enregistreur d'écran (arrêter l'enregistrement)",
"stopping": "Arrêt de l'enregistrement..."
},
"name": "Enregistreur d'Écran",
"settings": {
"audio": {
"audio-sources-both": "Sortie système + entrée microphone",
"audio-sources-microphone-input": "Entrée microphone",
"audio-sources-none": "Pas d'audio",
"audio-sources-system-output": "Sortie système",
"codec": "Codec audio",
"codec-desc": "Opus est recommandé pour les meilleures performances et la plus petite taille audio",
"source": "Source audio",
"source-desc": "Source audio à capturer pendant l'enregistrement",
"title": "Paramètres Audio"
},
"filename-pattern": {
"description": "Modèle de nom de fichier utilisant les codes date/heure (par exemple, recording_yyyyMMdd_HHmmss)",
"label": "Modèle de nom de fichier"
},
"general": {
"copy-to-clipboard": "Copier dans le presse-papiers",
"copy-to-clipboard-description": "Copier le fichier dans le presse-papiers une fois l'enregistrement terminé.",
"output-folder": "Dossier de sortie",
"output-folder-description": "Dossier où les enregistrements d'écran seront enregistrés",
"show-cursor": "Afficher le curseur",
"show-cursor-description": "Enregistrer le curseur de la souris dans la vidéo",
"title": "Général"
},
"title": "Paramètres de l'Enregistreur d'Écran",
"video": {
"codec": "Codec vidéo",
"codec-desc": "h264 est le codec le plus courant",
"color-range": "Gamme de couleurs",
"color-range-desc": "Limité est recommandé pour une meilleure compatibilité",
"color-range-full": "Complet / Plein",
"color-range-limited": "Limité(e)",
"frame-rate": "Fréquence d'images",
"frame-rate-desc": "Fréquence d'images cible pour les enregistrements d'écran",
"quality": "Qualité vidéo",
"quality-desc": "Une qualité supérieure résulte en des fichiers plus volumineux",
"quality-high": "Haut/Haute",
"quality-medium": "Moyen",
"quality-ultra": "Ultra",
"quality-very-high": "Très élevé",
"resolution": "Résolution",
"resolution-desc": "Limiter la résolution de sortie. Par défaut utilise la résolution d'écran originale",
"resolution-original": "Default",
"source": "Source vidéo",
"source-desc": "Portal est recommandé, si vous obtenez des artefacts essayez Écran",
"sources-portal": "Portail",
"sources-screen": "Écran",
"title": "Paramètres Vidéo"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Hardveresen gyorsított képernyőfelvétel testreszabható videó- és hangbeállításokkal",
"messages": {
"failed-general": "A rögzítő hibával kilépett.",
"failed-gpu": "A gpu-screen-recorder váratlanul leállt.",
"failed-start": "A felvétel indítása sikertelen.",
"no-portals": "Az asztali portálok nem futnak.",
"no-portals-desc": "xdg-desktop-portal és egy kompozitor portál (wlr/hyprland/gnome/kde) indítása.",
"not-installed": "A gpu-screen-recorder nincs telepítve.",
"not-installed-desc": "Kérlek, telepítsd a gpu-screen-recorder alkalmazást a képernyőfelvétel funkciók használatához.",
"saved": "A felvétel mentve.",
"start-recording": "Képernyőrögzítő (felvétel indítása)",
"started": "A felvétel elindult.",
"stop-recording": "Képernyőfelvevő (felvétel leállítása)",
"stopping": "A felvétel leállítása…"
},
"name": "Képernyőfelvevő",
"settings": {
"audio": {
"audio-sources-both": "Rendszerkimenet + mikrofonbemenet",
"audio-sources-microphone-input": "Mikrofon bemenet",
"audio-sources-none": "Nincs hang",
"audio-sources-system-output": "Rendszerkimenet",
"codec": "Audió kodek",
"codec-desc": "Az Opus ajánlott a legjobb teljesítmény és a legkisebb hangméret érdekében",
"source": "Hangforrás",
"source-desc": "Hangrögzítés során rögzítendő hangforrás",
"title": "Hangbeállítások"
},
"filename-pattern": {
"description": "Fájlnév minta dátum/idő kódokkal (pl. recording_yyyyMMdd_HHmmss)",
"label": "Fájlnév minta"
},
"general": {
"copy-to-clipboard": "Másolás a vágólapra",
"copy-to-clipboard-description": "A felvétel befejezése után másolja a fájlt a vágólapra.",
"output-folder": "Kimeneti mappa",
"output-folder-description": "Mappa, ahová a képernyőfelvételek mentésre kerülnek",
"show-cursor": "Kurzor megjelenítése",
"show-cursor-description": "Egérkurzor rögzítése a videóban",
"title": "Általános"
},
"title": "Képernyőrögzítő beállítások",
"video": {
"codec": "Videó kodek",
"codec-desc": "a h264 a legelterjedtebb kodek",
"color-range": "Színtartomány",
"color-range-desc": "A korlátozott ajánlott a jobb kompatibilitás érdekében",
"color-range-full": "Teljes",
"color-range-limited": "Korlátozott",
"frame-rate": "Képkockasebesség",
"frame-rate-desc": "Képernyőfelvételek célzott képkockasebessége",
"quality": "Videóminőség",
"quality-desc": "A jobb minőség nagyobb fájlméretet eredményez",
"quality-high": "Magas",
"quality-medium": "Közepes",
"quality-ultra": "Ultra",
"quality-very-high": "Nagyon magas",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Videóforrás",
"source-desc": "A Portal ajánlott, ha hibákat tapasztalsz, próbáld a Screen-t",
"sources-portal": "Portál",
"sources-screen": "Képernyő",
"title": "Videóbeállítások"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Registrazione dello schermo con accelerazione hardware e impostazioni video e audio personalizzabili",
"messages": {
"failed-general": "Registratore uscito con un errore.",
"failed-gpu": "ضبط الشاشة باستخدام معالج الرسوميات توقف بشكل غير متوقع.",
"failed-start": "Nuk arrita të filloj regjistrimin.",
"no-portals": "Non è in esecuzione alcun portale desktop.",
"no-portals-desc": "Avvia xdg-desktop-portal e un portale compositore (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder non è installato.",
"not-installed-desc": "Bitte installiere gpu-screen-recorder, um die Bildschirmaufzeichnungsfunktionen zu nutzen.",
"saved": "Registrazione salvata.",
"start-recording": "P錄影 (開始錄影)",
"started": "Aufnahme gestartet.",
"stop-recording": "Skjáupptökutæki (hætta upptöku)",
"stopping": "Nagpapatigil ng pagrekord..."
},
"name": "Registratore Schermo",
"settings": {
"audio": {
"audio-sources-both": "Risultato del sistema + ingresso microfono",
"audio-sources-microphone-input": "Eingang für Mikrofon",
"audio-sources-none": "Léir aon fhuaim",
"audio-sources-system-output": "Risultato del sistema",
"codec": "Codec audio",
"codec-desc": "Opus è consigliato per le migliori prestazioni e dimensioni audio più piccole",
"source": "Sorgente audio",
"source-desc": "Sorgente audio da catturare durante la registrazione",
"title": "Impostazioni Audio"
},
"filename-pattern": {
"description": "Padrone di u nome di u schedariu chì usa i codici di data/ora (per esempiu, recording_yyyyMMdd_HHmmss)",
"label": "Modello nome file"
},
"general": {
"copy-to-clipboard": "Copia negli appunti",
"copy-to-clipboard-description": "Kopyahin ang file sa clipboard pagkatapos matapos ang pag-record.",
"output-folder": "Cartella di output",
"output-folder-description": "Cartella dove verranno salvate le registrazioni dello schermo",
"show-cursor": "Mostra cursore",
"show-cursor-description": "Registra il cursore del mouse nel video",
"title": "Generale"
},
"title": "Impostazioni Registratore Schermo",
"video": {
"codec": "Codec video",
"codec-desc": "h264 è il codec più comune",
"color-range": "Gamma colori",
"color-range-desc": "Limitato è consigliato per una migliore compatibilità",
"color-range-full": "Puno",
"color-range-limited": "Limitato",
"frame-rate": "Frequenza fotogrammi",
"frame-rate-desc": "Frequenza fotogrammi target per le registrazioni dello schermo",
"quality": "Qualità video",
"quality-desc": "Qualità superiore risulta in file più grandi",
"quality-high": "Alta",
"quality-medium": "Mezzano",
"quality-ultra": "Ultra",
"quality-very-high": "Molto alto",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Sorgente video",
"source-desc": "Portal è consigliato, se si ottengono artefatti prova Schermo",
"sources-portal": "Portale",
"sources-screen": "Skjerm",
"title": "Impostazioni Video"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "カスタマイズ可能なビデオおよびオーディオ設定を備えたハードウェアアクセラレーション画面録画",
"messages": {
"failed-general": "レコーダーがエラーで終了しました。",
"failed-gpu": "gpu-screen-recorder が予期せず終了しました。",
"failed-start": "録画を開始できませんでした。",
"no-portals": "デスクトップポータルが実行されていません。",
"no-portals-desc": "xdg-desktop-portalとコンポジターポータル (wlr/hyprland/gnome/kde) を起動します。",
"not-installed": "gpu-screen-recorder がインストールされていません。",
"not-installed-desc": "画面録画機能を使用するには、gpu-screen-recorderをインストールしてください。",
"saved": "録音を保存しました。",
"start-recording": "画面録画(録画開始)",
"started": "録音を開始しました。",
"stop-recording": "画面録画(録画停止)",
"stopping": "録画を停止しています…"
},
"name": "画面レコーダー",
"settings": {
"audio": {
"audio-sources-both": "システム出力 + マイク入力",
"audio-sources-microphone-input": "マイク入力",
"audio-sources-none": "音声なし",
"audio-sources-system-output": "システム出力",
"codec": "オーディオコーデック",
"codec-desc": "最高のパフォーマンスと最小のオーディオサイズにはOpusが推奨されます",
"source": "オーディオソース",
"source-desc": "録画中にキャプチャするオーディオソース",
"title": "オーディオ設定"
},
"filename-pattern": {
"description": "日付/時刻コードを使用したファイル名パターンrecording_yyyyMMdd_HHmmss",
"label": "ファイル名のパターン"
},
"general": {
"copy-to-clipboard": "クリップボードにコピー",
"copy-to-clipboard-description": "録画終了後、ファイルをクリップボードにコピーします。",
"output-folder": "出力フォルダー",
"output-folder-description": "画面録画が保存されるフォルダー",
"show-cursor": "カーソルを表示",
"show-cursor-description": "ビデオにマウスカーソルを記録する",
"title": "全般"
},
"title": "画面レコーダー設定",
"video": {
"codec": "ビデオコーデック",
"codec-desc": "h264は最も一般的なコーデックです",
"color-range": "色範囲",
"color-range-desc": "互換性向上のため制限付きが推奨されます",
"color-range-full": "フル",
"color-range-limited": "限定",
"frame-rate": "フレームレート",
"frame-rate-desc": "画面録画の目標フレームレート",
"quality": "ビデオ品質",
"quality-desc": "品質が高いほどファイルサイズが大きくなります",
"quality-high": "高い",
"quality-medium": "ミディアム",
"quality-ultra": "ウルトラ",
"quality-very-high": "非常に高い",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "ビデオソース",
"source-desc": "Portalが推奨されます。アーティファクトが発生する場合は画面を試してください",
"sources-portal": "ポータル",
"sources-screen": "スクリーン",
"title": "ビデオ設定"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Qeydkirina dîmenderê ya bi lezkerdana hardware bi mîhengên vîdyo û deng ên xwerû",
"messages": {
"failed-general": "Qeydker bi xeletî derket.",
"failed-gpu": "Qeydkerê dîmenderê GPU bi awayekî nediyar derket.",
"failed-start": "Dest pê kirina qeydê bi ser neket.",
"no-portals": "Portalên sermaseyê naxebitin.",
"no-portals-desc": "Xdg-desktop-portal û portalekî komposîtorê (wlr/hyprland/gnome/kde) bide destpêkirin.",
"not-installed": "gpu-screen-recorder nehati hati saz kirin.",
"not-installed-desc": "Ji bo bikaranîna taybetmendiyên tomarkirina dîmenderê, ji kerema xwe gpu-screen-recorder saz bikin.",
"saved": "Tomar qeyd kirin.",
"start-recording": "Qeydkerê ekranê (dest bi qeydkirinê bike)",
"started": "Qeydkirin dest pê kir.",
"stop-recording": "Tomarkera dîmenderê (tomarkirinê bide sekinandin)",
"stopping": "Qeydkirin radiweste…"
},
"name": "Qeydkerê Ekranê",
"settings": {
"audio": {
"audio-sources-both": "Derçûna pergalê + têketina mîkrofonê",
"audio-sources-microphone-input": "Ketina mîkrofonê",
"audio-sources-none": "Ti dengê tune",
"audio-sources-system-output": "Derçûna pergalê",
"codec": "Kodêkê deng",
"codec-desc": "Opus ji bo performansa herî baş û mezinahiya dengî ya herî biçûk tê pêşniyar kirin",
"source": "Çavkanîya deng",
"source-desc": "Çavkanîya dengî ya ku di dema qeydkirinê de were girtin",
"title": "Mîhengên Deng"
},
"filename-pattern": {
"description": "Şiklê navê pelê ku kodên dîrok/dem bikar tîne (mînak, recording_yyyyMMdd_HHmmss)",
"label": "Nimûneya navê pelê"
},
"general": {
"copy-to-clipboard": "Kopyayî ser clipboardê bike",
"copy-to-clipboard-description": "Piştî qedandina tomarkirinê pelê kopî klîpbordê bike.",
"output-folder": "Cilda peldanka ya derketinê",
"output-folder-description": "Cihê ku tomarên ekranê dê lê bên tomarkirin",
"show-cursor": "Nîşan bide mişk",
"show-cursor-description": "Qeydê nîşankerê mişkê di vîdeoyê de",
"title": "Giştî"
},
"title": "Mîhengên Qeydkerê Dîmenderê",
"video": {
"codec": "Kodêka vîdyoyî",
"codec-desc": "h264 kodêka herî berbelav e",
"color-range": "Rêza rengan",
"color-range-desc": "Bi sînorkirî ji bo lihevkirina baştir tê pêşniyarkirin",
"color-range-full": "Tije",
"color-range-limited": "Sînorkirî",
"frame-rate": "Rêjeya çarçoveyê",
"frame-rate-desc": "Rêjeya çarçoveya hedefê ji bo qeydên ekranê",
"quality": "Kalîteya vîdyoyê",
"quality-desc": "Encamên bi kalîte bilindtir dibin sedema mezinahiyên pelan ên mezintir",
"quality-high": "Bilind",
"quality-medium": "Navîn",
"quality-ultra": "Ultra",
"quality-very-high": "Zaf bilind",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Çavkanîya vîdyoyê",
"source-desc": "Portal tê pêşniyarkirin, eger tu artefaktan bibînî Screen biceribîne",
"sources-portal": "Portal",
"sources-screen": "Dîmende",
"title": "Mîhengên Vîdeoyê"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Hardware-versnelde schermopname met aanpasbare video- en audio-instellingen",
"messages": {
"failed-general": "Recorder is afgesloten met een fout.",
"failed-gpu": "gpu-screen-recorder is onverwachts afgesloten.",
"failed-start": "Opname starten mislukt.",
"no-portals": "Desktop portals werken niet.",
"no-portals-desc": "Start xdg-desktop-portal en een compositor portaal (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder niet geïnstalleerd.",
"not-installed-desc": "Installeer gpu-screen-recorder om schermopnamefuncties te gebruiken.",
"saved": "Opname opgeslagen.",
"start-recording": "Schermrecorder (opname starten)",
"started": "Opname gestart.",
"stop-recording": "Schermrecorder (opname stoppen)",
"stopping": "Opname stoppen…"
},
"name": "Schermrecorder",
"settings": {
"audio": {
"audio-sources-both": "Systeemuitvoer + microfooningang",
"audio-sources-microphone-input": "Microfooningang",
"audio-sources-none": "Geen audio",
"audio-sources-system-output": "Systeemuitvoer",
"codec": "Audio-codec",
"codec-desc": "Opus wordt aanbevolen voor beste prestaties en kleinste audiogrootte",
"source": "Audiobron",
"source-desc": "Audiobron om tijdens opname vast te leggen",
"title": "Audio-instellingen"
},
"filename-pattern": {
"description": "Bestandsnaam patroon met datum/tijd codes (bijv. recording_yyyyMMdd_HHmmss)",
"label": "Bestandsnaam patroon"
},
"general": {
"copy-to-clipboard": "Kopiëren naar klembord",
"copy-to-clipboard-description": "Kopieer het bestand naar het klembord nadat de opname is voltooid.",
"output-folder": "Uitvoermap",
"output-folder-description": "Map waar schermopnames worden opgeslagen",
"show-cursor": "Cursor tonen",
"show-cursor-description": "Muiscursor in de video opnemen",
"title": "Algemeen"
},
"title": "Schermrecorder Instellingen",
"video": {
"codec": "Video-codec",
"codec-desc": "h264 is de meest voorkomende codec",
"color-range": "Kleurbereik",
"color-range-desc": "Beperkt wordt aanbevolen voor betere compatibiliteit",
"color-range-full": "Volledig",
"color-range-limited": "Beperkt",
"frame-rate": "Framesnelheid",
"frame-rate-desc": "Doelframesnelheid voor schermopnames",
"quality": "Videokwaliteit",
"quality-desc": "Hogere kwaliteit resulteert in grotere bestanden",
"quality-high": "Hoog",
"quality-medium": "Medium",
"quality-ultra": "Ultra",
"quality-very-high": "Zeer hoog",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Videobron",
"source-desc": "Portal wordt aanbevolen, probeer Scherm als u artefacten krijgt",
"sources-portal": "Portaal",
"sources-screen": "Scherm",
"title": "Video-instellingen"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Nagrywanie ekranu z akceleracją sprzętową z możliwością dostosowania ustawień wideo i audio",
"messages": {
"failed-general": "Rejestrator zakończył pracę z błędem.",
"failed-gpu": "Rejestrator ekranu GPU zakończył pracę nieoczekiwanie.",
"failed-start": "Nie udało się rozpocząć nagrywania.",
"no-portals": "Portale pulpitu nie działają.",
"no-portals-desc": "Uruchom xdg-desktop-portal i portal kompozytora (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder nie jest zainstalowany.",
"not-installed-desc": "Zainstaluj gpu-screen-recorder, aby korzystać z funkcji nagrywania ekranu.",
"saved": "Nagranie zapisane.",
"start-recording": "Rejestrator ekranu (rozpocznij nagrywanie)",
"started": "Rozpoczęto nagrywanie.",
"stop-recording": "Rejestrator ekranu (zatrzymaj nagrywanie)",
"stopping": "Zatrzymywanie nagrywania…"
},
"name": "Rejestrator ekranu",
"settings": {
"audio": {
"audio-sources-both": "Wyjście systemowe + wejście mikrofonu",
"audio-sources-microphone-input": "Wejście mikrofonu",
"audio-sources-none": "Brak dźwięku",
"audio-sources-system-output": "Wyjście systemowe",
"codec": "Kodek audio",
"codec-desc": "Opus jest zalecany dla najlepszej wydajności i najmniejszego rozmiaru dźwięku",
"source": "Źródło dźwięku",
"source-desc": "Źródło dźwięku do przechwytywania podczas nagrywania",
"title": "Ustawienia audio"
},
"filename-pattern": {
"description": "Wzorzec nazwy pliku używający kodów daty/czasu (np. nagranie_rrrrMMdd_HHmmss)",
"label": "Wzorzec nazwy pliku"
},
"general": {
"copy-to-clipboard": "Kopiuj do schowka",
"copy-to-clipboard-description": "Kopiuj plik do schowka po zakończeniu nagrywania.",
"output-folder": "Folder wyjściowy",
"output-folder-description": "Folder, w którym będą zapisywane nagrania ekranu",
"show-cursor": "Pokaż kursor",
"show-cursor-description": "Nagrywaj kursor myszy na filmie",
"title": "Ogólne"
},
"title": "Ustawienia rejestratora ekranu",
"video": {
"codec": "Kodek wideo",
"codec-desc": "h264 to najpopularniejszy kodek",
"color-range": "Zakres kolorów",
"color-range-desc": "Zalecane jest \"Ograniczone\" dla lepszej kompatybilności",
"color-range-full": "Pełny",
"color-range-limited": "Ograniczone",
"frame-rate": "Liczba klatek na sekundę",
"frame-rate-desc": "Docelowa liczba klatek na sekundę dla nagrań ekranu",
"quality": "Jakość wideo",
"quality-desc": "Wyższa jakość skutkuje większymi rozmiarami plików",
"quality-high": "Wysoki",
"quality-medium": "Średni",
"quality-ultra": "Bardzo",
"quality-very-high": "Bardzo wysoki",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Źródło wideo",
"source-desc": "Zalecany jest Portal, jeśli występują artefakty, spróbuj opcji Ekran",
"sources-portal": "Portal",
"sources-screen": "Ekran",
"title": "Ustawienia wideo"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Gravação de tela acelerada por hardware com configurações personalizáveis de vídeo e áudio",
"messages": {
"failed-general": "O gravador foi encerrado com um erro.",
"failed-gpu": "gpu-screen-recorder foi encerrado inesperadamente.",
"failed-start": "Falha ao iniciar a gravação.",
"no-portals": "Portais de desktop não estão em execução.",
"no-portals-desc": "Inicie o xdg-desktop-portal e um portal compositor (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder não instalado.",
"not-installed-desc": "Por favor, instale o gpu-screen-recorder para usar os recursos de gravação de tela.",
"saved": "Gravação salva.",
"start-recording": "Gravador de tela (iniciar gravação)",
"started": "Gravação iniciada.",
"stop-recording": "Gravador de tela (parar gravação)",
"stopping": "Parando a gravação..."
},
"name": "Gravador de Tela",
"settings": {
"audio": {
"audio-sources-both": "Saída do sistema + entrada do microfone",
"audio-sources-microphone-input": "Entrada de microfone",
"audio-sources-none": "Sem áudio",
"audio-sources-system-output": "Saída do sistema",
"codec": "Codec de áudio",
"codec-desc": "Opus é recomendado para melhor desempenho e menor tamanho de áudio",
"source": "Fonte de áudio",
"source-desc": "Fonte de áudio para capturar durante a gravação",
"title": "Configurações de Áudio"
},
"filename-pattern": {
"description": "Padrão de nome de arquivo usando códigos de data/hora (por exemplo, recording_yyyyMMdd_HHmmss)",
"label": "Padrão de nome de arquivo"
},
"general": {
"copy-to-clipboard": "Copiar para área de transferência",
"copy-to-clipboard-description": "Copiar o arquivo para a área de transferência após a gravação terminar.",
"output-folder": "Pasta de saída",
"output-folder-description": "Pasta onde as gravações de tela serão salvas",
"show-cursor": "Mostrar cursor",
"show-cursor-description": "Gravar o cursor do mouse no vídeo",
"title": "Geral"
},
"title": "Configurações do Gravador de Tela",
"video": {
"codec": "Codec de vídeo",
"codec-desc": "h264 é o codec mais comum",
"color-range": "Faixa de cores",
"color-range-desc": "Limitado é recomendado para melhor compatibilidade",
"color-range-full": "Completo",
"color-range-limited": "Limitado",
"frame-rate": "Taxa de quadros",
"frame-rate-desc": "Taxa de quadros alvo para gravações de tela",
"quality": "Qualidade de vídeo",
"quality-desc": "Maior qualidade resulta em arquivos maiores",
"quality-high": "Alto(a)",
"quality-medium": "Médio",
"quality-ultra": "Ultra",
"quality-very-high": "Muito alto/altíssima/elevadíssimo(a)",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Fonte de vídeo",
"source-desc": "Portal é recomendado, se obtiver artefatos tente Tela",
"sources-portal": "Portal",
"sources-screen": "Tela",
"title": "Configurações de Vídeo"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Аппаратно-ускоренная запись экрана с настраиваемыми параметрами видео и аудио",
"messages": {
"failed-general": "Рекордер завершил работу с ошибкой.",
"failed-gpu": "gpu-screen-recorder неожиданно завершил работу.",
"failed-start": "Не удалось начать запись.",
"no-portals": "Порталы рабочего стола не работают.",
"no-portals-desc": "Запустить xdg-desktop-portal и портал композитора (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder не установлен.",
"not-installed-desc": "Пожалуйста, установите gpu-screen-recorder, чтобы использовать функции записи экрана.",
"saved": "Запись сохранена.",
"start-recording": "Запись экрана (начать запись)",
"started": "Запись началась.",
"stop-recording": "Запись экрана (остановить запись)",
"stopping": "Остановка записи…"
},
"name": "Запись Экрана",
"settings": {
"audio": {
"audio-sources-both": "Вывод системы + ввод с микрофона",
"audio-sources-microphone-input": "Микрофонный вход",
"audio-sources-none": "Нет звука",
"audio-sources-system-output": "Вывод системы",
"codec": "Аудиокодек",
"codec-desc": "Opus рекомендуется для лучшей производительности и наименьшего размера аудио",
"source": "Источник аудио",
"source-desc": "Источник аудио для захвата во время записи",
"title": "Настройки Аудио"
},
"filename-pattern": {
"description": "Шаблон имени файла с использованием кодов даты/времени (например, recording_yyyyMMdd_HHmmss)",
"label": "Шаблон имени файла"
},
"general": {
"copy-to-clipboard": "Копировать в буфер обмена",
"copy-to-clipboard-description": "Скопировать файл в буфер обмена после завершения записи.",
"output-folder": "Папка вывода",
"output-folder-description": "Папка, в которую будут сохраняться записи экрана",
"show-cursor": "Показать курсор",
"show-cursor-description": "Записывать курсор мыши в видео",
"title": "Общие"
},
"title": "Настройки Записи Экрана",
"video": {
"codec": "Видеокодек",
"codec-desc": "h264 является наиболее распространенным кодеком",
"color-range": "Цветовой диапазон",
"color-range-desc": "Ограниченный рекомендуется для лучшей совместимости",
"color-range-full": "Полный",
"color-range-limited": "Ограниченный",
"frame-rate": "Частота кадров",
"frame-rate-desc": "Целевая частота кадров для записи экрана",
"quality": "Качество видео",
"quality-desc": "Более высокое качество приводит к большим размерам файлов",
"quality-high": "Высокий",
"quality-medium": "Средний",
"quality-ultra": "Ультра",
"quality-very-high": "Очень высокий",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Источник видео",
"source-desc": "Рекомендуется Portal, если появляются артефакты попробуйте Экран",
"sources-portal": "Портал",
"sources-screen": "Экран",
"title": "Настройки Видео"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Özelleştirilebilir video ve ses ayarlarıyla donanım hızlandırmalı ekran kaydı",
"messages": {
"failed-general": "Kaydedici bir hatayla çıktı.",
"failed-gpu": "gpu-screen-recorder beklenmedik şekilde çıktı.",
"failed-start": "Kayda başlama başarısız oldu.",
"no-portals": "Masaüstü portalları çalışmıyor.",
"no-portals-desc": "xdg-desktop-portal'ı ve bir compositor portalı başlat (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder kurulu değil.",
"not-installed-desc": "Ekran kaydı özelliklerini kullanmak için lütfen gpu-screen-recorder'ı kurun.",
"saved": "Kayıt kaydedildi.",
"start-recording": "Ekran kaydedici (kayda başla)",
"started": "Kayıt başladı.",
"stop-recording": "Ekran kaydedici (kaydı durdur)",
"stopping": "Kaydı durdurma…"
},
"name": "Ekran Kaydedici",
"settings": {
"audio": {
"audio-sources-both": "Sistem çıktısı + mikrofon girişi",
"audio-sources-microphone-input": "Mikrofon girişi",
"audio-sources-none": "Ses yok",
"audio-sources-system-output": "Sistem çıktısı",
"codec": "Ses codec",
"codec-desc": "En iyi performans ve en küçük ses boyutu için Opus önerilir",
"source": "Ses kaynağı",
"source-desc": "Kayıt sırasında yakalanacak ses kaynağı",
"title": "Ses Ayarları"
},
"filename-pattern": {
"description": "Tarih/saat kodları kullanan dosya adı deseni (ör. kayit_yyyyMMdd_HHmmss)",
"label": "Dosya adı deseni"
},
"general": {
"copy-to-clipboard": "Panoya kopyala",
"copy-to-clipboard-description": "Kayıt bittikten sonra dosyayı panoya kopyala.",
"output-folder": ıktı klasörü",
"output-folder-description": "Ekran kayıtlarının kaydedileceği klasör",
"show-cursor": "İmleci göster",
"show-cursor-description": "Videoda fare imlecini kaydet",
"title": "Genel"
},
"title": "Ekran Kaydedici Ayarları",
"video": {
"codec": "Video codec",
"codec-desc": "h264 en yaygın codec'tir",
"color-range": "Renk aralığı",
"color-range-desc": "Daha iyi uyumluluk için Sınırlı önerilir",
"color-range-full": "Tam",
"color-range-limited": "Sınırlı",
"frame-rate": "Kare hızı",
"frame-rate-desc": "Ekran kayıtları için hedef kare hızı",
"quality": "Video kalitesi",
"quality-desc": "Daha yüksek kalite daha büyük dosya boyutlarına yol açar",
"quality-high": "Yüksek",
"quality-medium": "Orta",
"quality-ultra": "Ultra",
"quality-very-high": "Çok yüksek",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Video kaynağı",
"source-desc": "Portal önerilir, artefaktlar alırsanız Ekran'ı deneyin",
"sources-portal": "Portal",
"sources-screen": "Ekran",
"title": "Video Ayarları"
}
}
}

View File

@@ -0,0 +1,69 @@
{
"description": "Апаратно-прискорений запис екрану з налаштовуваними параметрами відео та аудіо",
"messages": {
"failed-general": "Рекордер завершив роботу з помилкою.",
"failed-gpu": "gpu-screen-recorder несподівано завершив роботу.",
"failed-start": "Не вдалося почати запис.",
"no-portals": "Настільні портали не працюють.",
"no-portals-desc": "Запустити xdg-desktop-portal та портал композитора (wlr/hyprland/gnome/kde).",
"not-installed": "gpu-screen-recorder не встановлено.",
"not-installed-desc": "Будь ласка, встановіть gpu-screen-recorder, щоб використовувати функції запису екрана.",
"saved": "Запис збережено.",
"start-recording": "Запис екрана (почати запис)",
"started": "Запис розпочато.",
"stop-recording": "Запис екрана (зупинити запис)",
"stopping": "Зупинка запису…"
},
"name": "Записувач Екрану",
"settings": {
"audio": {
"audio-sources-both": "Вивід системи + вхід мікрофона",
"audio-sources-microphone-input": "Мікрофонний вхід",
"audio-sources-none": "Немає аудіо",
"audio-sources-system-output": "Вивід системи",
"codec": "Аудіокодек",
"codec-desc": "Opus рекомендується для найкращої продуктивності та найменшого розміру аудіо",
"source": "Джерело аудіо",
"source-desc": "Джерело аудіо для захоплення під час запису",
"title": "Налаштування Аудіо"
},
"filename-pattern": {
"description": "Шаблон імені файлу з використанням кодів дати/часу (наприклад, recording_yyyyMMdd_HHmmss)",
"label": "Шаблон імені файлу"
},
"general": {
"copy-to-clipboard": "Копіювати до буфера обміну",
"copy-to-clipboard-description": "Копіювати файл у буфер обміну після завершення запису.",
"output-folder": "Папка виводу",
"output-folder-description": "Папка, де зберігатимуться записи екрану",
"show-cursor": "Показати курсор",
"show-cursor-description": "Записувати курсор миші у відео",
"title": "Загальні"
},
"title": "Налаштування Записувача Екрану",
"video": {
"codec": "Відеокодек",
"codec-desc": "h264 є найпоширенішим кодеком",
"color-range": "Кольоровий діапазон",
"color-range-desc": "Обмежений рекомендується для кращої сумісності",
"color-range-full": "Повний",
"color-range-limited": "Обмежений",
"frame-rate": "Частота кадрів",
"frame-rate-desc": "Цільова частота кадрів для запису екрану",
"quality": "Якість відео",
"quality-desc": "Вища якість призводить до більших розмірів файлів",
"quality-high": "Високий",
"quality-medium": "Середній",
"quality-ultra": "Ультра",
"quality-very-high": "Дуже високий",
"resolution": "Resolution",
"resolution-desc": "Limit output resolution. Default uses original screen resolution",
"resolution-original": "Default",
"source": "Джерело відео",
"source-desc": "Рекомендується Portal, якщо з'являються артефакти спробуйте Екран",
"sources-portal": "Портал",
"sources-screen": "Екран",
"title": "Налаштування Відео"
}
}
}

View File

@@ -0,0 +1,70 @@
{
"description": "具有可自定义视频和音频设置的硬件加速屏幕录制",
"messages": {
"failed-general": "录制器出错退出。",
"failed-gpu": "gpu-screen-recorder 意外退出。",
"failed-start": "无法开始录制。",
"no-portals": "桌面门户未运行。",
"no-portals-desc": "启动 xdg-desktop-portal 和一个合成器门户 (wlr/hyprland/gnome/kde)。",
"not-installed": "gpu-screen-recorder 未安装。",
"not-installed-desc": "请安装 gpu-screen-recorder 以使用屏幕录制功能。",
"saved": "已保存录像。",
"start-recording": "屏幕录像(开始录制)",
"started": "已开始录制。",
"stop-recording": "屏幕录像(停止录制)",
"stopping": "停止录制…",
"open-file": "打开文件"
},
"name": "屏幕录制器",
"settings": {
"audio": {
"audio-sources-both": "系统输出 + 麦克风输入",
"audio-sources-microphone-input": "麦克风输入",
"audio-sources-none": "无音频",
"audio-sources-system-output": "系统输出",
"codec": "音频编解码器",
"codec-desc": "建议使用 Opus 以获得最佳性能和最小音频大小",
"source": "音频源",
"source-desc": "录制期间要捕获的音频源",
"title": "音频设置"
},
"filename-pattern": {
"description": "使用日期/时间代码的文件名模式 (例如recording_yyyyMMdd_HHmmss)",
"label": "文件名模式"
},
"general": {
"copy-to-clipboard": "复制到剪贴板",
"copy-to-clipboard-description": "录制结束后将文件复制到剪贴板。",
"output-folder": "输出文件夹",
"output-folder-description": "屏幕录制将保存到的文件夹",
"show-cursor": "显示光标",
"show-cursor-description": "在视频中录制鼠标光标",
"title": "常规"
},
"title": "屏幕录制器设置",
"video": {
"codec": "视频编解码器",
"codec-desc": "h264 是最常见的编解码器",
"color-range": "色彩范围",
"color-range-desc": "建议使用“有限”以获得更好的兼容性",
"color-range-full": "全范围",
"color-range-limited": "有限",
"frame-rate": "帧率",
"frame-rate-desc": "屏幕录制的目标帧率",
"quality": "视频质量",
"quality-desc": "更高的质量会导致更大的文件大小",
"quality-high": "高",
"quality-medium": "中等",
"quality-ultra": "极高",
"quality-very-high": "非常高",
"resolution": "分辨率",
"resolution-desc": "限制输出分辨率。默认使用原始屏幕分辨率",
"resolution-original": "默认",
"source": "视频源",
"source-desc": "推荐使用桌面门户 (Portal),如果出现画面异常请尝试屏幕",
"sources-portal": "桌面门户",
"sources-screen": "屏幕",
"title": "视频设置"
}
}
}

View File

@@ -0,0 +1,39 @@
{
"id": "screen-recorder",
"name": "Screen Recorder",
"version": "1.0.8",
"minNoctaliaVersion": "3.6.0",
"author": "Noctalia Team",
"license": "MIT",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "Hardware-accelerated screen recording using gpu-screen-recorder with customizable video and audio settings",
"tags": [
"Bar",
"Utility"
],
"entryPoints": {
"main": "Main.qml",
"barWidget": "BarWidget.qml",
"controlCenterWidget": "ControlCenterWidget.qml",
"settings": "Settings.qml"
},
"dependencies": {
"plugins": []
},
"metadata": {
"defaultSettings": {
"directory": "",
"filenamePattern": "recording_yyyyMMdd_HHmmss",
"frameRate": "60",
"audioCodec": "opus",
"videoCodec": "h264",
"quality": "very_high",
"colorRange": "limited",
"showCursor": true,
"copyToClipboard": false,
"audioSource": "default_output",
"videoSource": "portal",
"resolution": "original"
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 128 KiB

View File

@@ -60,7 +60,7 @@ Rectangle {
Layout.alignment: Qt.AlignHCenter | Qt.AlignVCenter
text: root.pluginApi?.mainInstance?.updateCount.toString()
color: root.hovered ? Color.mOnHover : Color.mOnSurface
pointSize: Style.fontSizeS
pointSize: Style.barFontSize
}
}

View File

@@ -1,12 +1,13 @@
{
"id": "update-count",
"name": "Update Count",
"version": "1.0.6",
"version": "1.0.9",
"minNoctaliaVersion": "3.6.0",
"author": "BukoMoon",
"license": "GPLv3",
"repository": "https://github.com/noctalia-dev/noctalia-plugins",
"description": "Checks for system updates and shows the update count. Click to run update command in a terminal.",
"tags": ["Bar", "System"],
"entryPoints": {
"main": "Main.qml",
"barWidget": "BarWidget.qml",

View File

@@ -2,13 +2,13 @@
{
"name": "yay",
"cmdCheck": "command -v yay >/dev/null 2>&1",
"cmdGetNumUpdates": "yay -Sy >/dev/null 2>&1; yay -Quq 2>/dev/null | wc -l",
"cmdGetNumUpdates": "yay -Qu 2>/dev/null | wc -l",
"cmdDoSystemUpdate": "yay -Syu"
},
{
"name": "paru",
"cmdCheck": "command -v paru >/dev/null 2>&1",
"cmdGetNumUpdates": "paru -Sy >/dev/null 2>&1; paru -Quq 2>/dev/null | wc -l",
"cmdGetNumUpdates": "paru -Qu 2>/dev/null | wc -l",
"cmdDoSystemUpdate": "paru -Syu"
},
{

View File

@@ -1,14 +1,20 @@
{
"appLauncher": {
"autoPasteClipboard": false,
"clipboardWrapText": true,
"customLaunchPrefix": "",
"customLaunchPrefixEnabled": false,
"enableClipPreview": true,
"enableClipboardHistory": true,
"enableSettingsSearch": true,
"iconMode": "tabler",
"pinnedExecs": [
"ignoreMouseInput": false,
"pinnedApps": [
],
"position": "center",
"screenshotAnnotationTool": "",
"showCategories": true,
"showIconBackground": true,
"sortByMostUsed": true,
"terminalCommand": "alacritty -e",
"useApp2Unit": false,
@@ -16,11 +22,11 @@
},
"audio": {
"cavaFrameRate": 30,
"externalMixer": "pwvucontrol || pavucontrol",
"mprisBlacklist": [
],
"preferredPlayer": "",
"visualizerType": "linear",
"volumeFeedback": false,
"volumeOverdrive": true,
"volumeStep": 5
},
@@ -30,22 +36,30 @@
"density": "comfortable",
"exclusive": true,
"floating": false,
"marginHorizontal": 0.25,
"marginVertical": 0.25,
"hideOnOverview": false,
"marginHorizontal": 5,
"marginVertical": 5,
"monitors": [
],
"outerCorners": false,
"position": "top",
"screenOverrides": [
],
"showCapsule": true,
"showOutline": false,
"useSeparateOpacity": false,
"widgets": {
"center": [
{
"compactMode": false,
"compactShowAlbumArt": true,
"compactShowVisualizer": false,
"hideMode": "hidden",
"hideWhenIdle": false,
"id": "MediaMini",
"maxWidth": 250,
"panelShowAlbumArt": true,
"panelShowVisualizer": true,
"scrollingMode": "hover",
"showAlbumArt": true,
"showArtistFirst": true,
@@ -57,9 +71,12 @@
],
"left": [
{
"colorizeSystemIcon": "none",
"enableColorization": false,
"hideMode": "alwaysExpanded",
"icon": "rocket",
"id": "CustomButton",
"ipcIdentifier": "",
"leftClickExec": "qs -c noctalia-shell ipc call launcher toggle",
"leftClickUpdateText": false,
"maxTextLength": {
@@ -91,6 +108,7 @@
"followFocusedScreen": false,
"groupedBorderOpacity": 1,
"hideUnoccupied": true,
"iconScale": 0.8,
"id": "Workspace",
"labelMode": "name",
"showApplications": false,
@@ -123,9 +141,11 @@
"showCpuUsage": true,
"showDiskUsage": false,
"showGpuTemp": false,
"showLoadAverage": false,
"showMemoryAsPercent": false,
"showMemoryUsage": true,
"showNetworkStats": true,
"showSwapUsage": false,
"useMonospaceFont": true,
"usePrimaryColor": true
},
@@ -145,9 +165,38 @@
],
"right": [
{
"defaultSettings": {
"audioCodec": "opus",
"audioSource": "default_output",
"colorRange": "limited",
"copyToClipboard": false,
"directory": "",
"filenamePattern": "recording_yyyyMMdd_HHmmss",
"frameRate": "60",
"quality": "very_high",
"showCursor": true,
"videoCodec": "h264",
"videoSource": "portal"
},
"id": "plugin:screen-recorder"
},
{
"blacklist": [
],
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": [
]
},
{
"colorizeSystemIcon": "none",
"enableColorization": false,
"hideMode": "alwaysExpanded",
"icon": "eye",
"id": "CustomButton",
"ipcIdentifier": "",
"leftClickExec": "/home/aiden/toggle-transparency.sh",
"leftClickUpdateText": true,
"maxTextLength": {
@@ -173,35 +222,9 @@
"wheelUpdateText": false
},
{
"id": "ScreenRecorder"
},
{
"blacklist": [
],
"colorizeIcons": false,
"drawerEnabled": true,
"hidePassive": false,
"id": "Tray",
"pinned": [
]
},
{
"hideWhenZero": true,
"id": "NotificationHistory",
"showUnreadBadge": true
},
{
"deviceNativePath": "",
"displayMode": "alwaysShow",
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": true,
"warningThreshold": 30
},
{
"displayMode": "onhover",
"id": "Volume"
"id": "Volume",
"middleClickCommand": "pwvucontrol || pavucontrol"
},
{
"displayMode": "onhover",
@@ -214,6 +237,26 @@
},
"id": "plugin:privacy-indicator"
},
{
"deviceNativePath": "",
"displayMode": "alwaysShow",
"hideIfIdle": false,
"hideIfNotDetected": true,
"id": "Battery",
"showNoctaliaPerformance": false,
"showPowerProfiles": true,
"warningThreshold": 30
},
{
"displayMode": "alwaysShow",
"id": "VPN"
},
{
"hideWhenZero": true,
"hideWhenZeroUnread": false,
"id": "NotificationHistory",
"showUnreadBadge": true
},
{
"colorizeDistroLogo": false,
"colorizeSystemIcon": "none",
@@ -241,10 +284,6 @@
"enabled": true,
"id": "calendar-month-card"
},
{
"enabled": true,
"id": "timer-card"
},
{
"enabled": true,
"id": "weather-card"
@@ -253,10 +292,10 @@
},
"colorSchemes": {
"darkMode": true,
"generateTemplatesForPredefined": true,
"generationMethod": "tonal-spot",
"manualSunrise": "06:30",
"manualSunset": "18:30",
"matugenSchemeType": "scheme-fruit-salad",
"monitorForColors": "",
"predefinedScheme": "Catppuccin",
"schedulingMode": "off",
"useWallpaperColors": false
@@ -288,6 +327,7 @@
"id": "brightness-card"
}
],
"diskPath": "/",
"position": "close_to_bar_button",
"shortcuts": {
"left": [
@@ -296,18 +336,9 @@
},
{
"id": "Bluetooth"
},
{
"id": "ScreenRecorder"
},
{
"id": "WallpaperSelector"
}
],
"right": [
{
"id": "Notifications"
},
{
"id": "PowerProfile"
},
@@ -341,16 +372,17 @@
"backgroundOpacity": 1,
"colorizeIcons": true,
"deadOpacity": 0.6,
"displayMode": "auto_hide",
"displayMode": "always_visible",
"enabled": false,
"floatingRatio": 1,
"inactiveIndicators": false,
"monitors": [
],
"onlySameOutput": true,
"onlySameOutput": false,
"pinnedApps": [
],
"pinnedStatic": false,
"position": "bottom",
"size": 1
},
"general": {
@@ -361,20 +393,24 @@
"boxRadiusRatio": 1,
"compactLockScreen": false,
"dimmerOpacity": 0,
"enableLockScreenCountdown": true,
"enableShadows": true,
"forceBlackScreenCorners": false,
"iRadiusRatio": 1,
"language": "",
"lockOnSuspend": true,
"lockScreenCountdownDuration": 10000,
"radiusRatio": 1,
"scaleRatio": 1,
"screenRadiusRatio": 1,
"shadowDirection": "bottom_right",
"shadowOffsetX": 2,
"shadowOffsetY": 3,
"showHibernateOnLockScreen": false,
"showChangelogOnStartup": true,
"showHibernateOnLockScreen": true,
"showScreenCorners": false,
"showSessionButtonsOnLockScreen": true
"showSessionButtonsOnLockScreen": true,
"telemetryEnabled": true
},
"hooks": {
"darkModeChange": "",
@@ -383,11 +419,15 @@
"performanceModeEnabled": "",
"screenLock": "",
"screenUnlock": "",
"session": "",
"startup": "",
"wallpaperChange": ""
},
"location": {
"analogClockInCalendar": false,
"firstDayOfWeek": -1,
"hideWeatherCityName": false,
"hideWeatherTimezone": false,
"name": "Winnipeg, MB",
"showCalendarEvents": true,
"showCalendarWeather": true,
@@ -398,6 +438,11 @@
"weatherShowEffects": true
},
"network": {
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"bluetoothRssiPollIntervalMs": 10000,
"bluetoothRssiPollingEnabled": false,
"wifiDetailsViewMode": "grid",
"wifiEnabled": true
},
"nightLight": {
@@ -413,6 +458,7 @@
"backgroundOpacity": 1,
"criticalUrgencyDuration": 15,
"enableKeyboardLayoutToast": true,
"enableMediaToast": false,
"enabled": true,
"location": "top_right",
"lowUrgencyDuration": 3,
@@ -451,21 +497,10 @@
],
"overlayLayer": true
},
"screenRecorder": {
"audioCodec": "opus",
"audioSource": "default_output",
"colorRange": "limited",
"copyToClipboard": false,
"directory": "/home/aiden/Videos",
"frameRate": 60,
"quality": "very_high",
"showCursor": true,
"videoCodec": "h264",
"videoSource": "portal"
},
"sessionMenu": {
"countdownDuration": 10000,
"enableCountdown": true,
"largeButtonsLayout": "grid",
"largeButtonsStyle": false,
"position": "center",
"powerOptions": [
@@ -485,7 +520,7 @@
"action": "hibernate",
"command": "",
"countdownEnabled": true,
"enabled": false
"enabled": true
},
{
"action": "reboot",
@@ -509,24 +544,27 @@
"showHeader": true,
"showNumberLabels": true
},
"settingsVersion": 35,
"settingsVersion": 44,
"systemMonitor": {
"cpuCriticalThreshold": 90,
"cpuPollingInterval": 3000,
"cpuWarningThreshold": 80,
"criticalColor": "",
"diskCriticalThreshold": 90,
"diskPath": "/",
"diskPollingInterval": 3000,
"diskWarningThreshold": 80,
"enableDgpuMonitoring": false,
"externalMonitor": "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor",
"gpuCriticalThreshold": 90,
"gpuPollingInterval": 3000,
"gpuWarningThreshold": 80,
"loadAvgPollingInterval": 3000,
"memCriticalThreshold": 90,
"memPollingInterval": 3000,
"memWarningThreshold": 80,
"networkPollingInterval": 3000,
"swapCriticalThreshold": 90,
"swapWarningThreshold": 80,
"tempCriticalThreshold": 90,
"tempPollingInterval": 3000,
"tempWarningThreshold": 80,
@@ -534,39 +572,35 @@
"warningColor": ""
},
"templates": {
"alacritty": false,
"cava": false,
"code": false,
"discord": false,
"emacs": false,
"enableUserTemplates": false,
"foot": false,
"fuzzel": false,
"ghostty": false,
"gtk": true,
"helix": false,
"hyprland": false,
"kcolorscheme": true,
"kitty": false,
"mango": false,
"niri": true,
"pywalfox": false,
"qt": true,
"spicetify": false,
"telegram": false,
"vicinae": false,
"walker": false,
"wezterm": false,
"yazi": false,
"zed": false
"activeTemplates": [
{
"enabled": true,
"id": "gtk"
},
{
"enabled": true,
"id": "qt"
},
{
"enabled": true,
"id": "kcolorscheme"
},
{
"enabled": true,
"id": "niri"
}
],
"enableUserTheming": false
},
"ui": {
"bluetoothDetailsViewMode": "grid",
"bluetoothHideUnnamedDevices": false,
"boxBorderEnabled": false,
"fontDefault": "Sans Serif",
"fontDefaultScale": 1,
"fontFixed": "monospace",
"fontFixedScale": 1,
"networkPanelView": "wifi",
"panelBackgroundOpacity": 0.5,
"panelsAttachedToBar": true,
"settingsPanelMode": "centered",
@@ -574,6 +608,7 @@
"wifiDetailsViewMode": "grid"
},
"wallpaper": {
"automationEnabled": true,
"directory": "/home/aiden/Pictures/Wallpapers",
"enableMultiMonitorDirectories": true,
"enabled": true,
@@ -589,14 +624,16 @@
],
"overviewEnabled": false,
"panelPosition": "follow_bar",
"randomEnabled": true,
"randomIntervalSec": 600,
"recursiveSearch": false,
"setWallpaperOnAllMonitors": false,
"showHiddenFiles": false,
"solidColor": "#1a1a2e",
"transitionDuration": 1500,
"transitionEdgeSmoothness": 0.05,
"transitionType": "random",
"useSolidColor": false,
"useWallhaven": false,
"viewMode": "single",
"wallhavenApiKey": "",
"wallhavenCategories": "111",
"wallhavenOrder": "desc",