first push of scripts
This commit is contained in:
parent
74d917ca0f
commit
6ccc8606ef
30
pywal/pywal-openrgb.py
Normal file
30
pywal/pywal-openrgb.py
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
import json
|
||||||
|
from openrgb import OpenRGBClient
|
||||||
|
from openrgb.utils import RGBColor
|
||||||
|
|
||||||
|
# Path to Pywal's colors.json
|
||||||
|
colors_file = '/home/Nicholai/.cache/wal/colors.json'
|
||||||
|
|
||||||
|
# Load Pywal colors
|
||||||
|
with open(colors_file, 'r') as f:
|
||||||
|
colors = json.load(f)
|
||||||
|
|
||||||
|
# Extract the first color from Pywal's palette
|
||||||
|
primary_color_hex = colors['colors']['color3']
|
||||||
|
|
||||||
|
import subprocess
|
||||||
|
|
||||||
|
# Remove the '#' prefix from the hex color
|
||||||
|
primary_color_hex_no_prefix = primary_color_hex.lstrip('#')
|
||||||
|
|
||||||
|
# Construct the command with the modified hex color
|
||||||
|
command = ["openrgb", "--color", primary_color_hex_no_prefix]
|
||||||
|
|
||||||
|
# Execute the command
|
||||||
|
try:
|
||||||
|
subprocess.run(command, check=True)
|
||||||
|
print(f"Successfully set OpenRGB color to {primary_color_hex_no_prefix}")
|
||||||
|
except subprocess.CalledProcessError as e:
|
||||||
|
print(f"Error setting OpenRGB color: {e}")
|
||||||
|
except FileNotFoundError:
|
||||||
|
print("Error: 'openrgb' command not found. Make sure OpenRGB is installed and in your PATH.")
|
||||||
22
pywal/pywal16.sh
Executable file
22
pywal/pywal16.sh
Executable file
@ -0,0 +1,22 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
#update waybar
|
||||||
|
cp "~/.cache/wal/colors-waybar.css" "~/.config/waybar/"
|
||||||
|
|
||||||
|
#killall -SIGUSR2 waybar
|
||||||
|
#waybar
|
||||||
|
|
||||||
|
#update oomox
|
||||||
|
#cp "~/.cache/wal/colors-oomox" "
|
||||||
|
nwg-look -x
|
||||||
|
|
||||||
|
#refresh qutebrowser if running
|
||||||
|
pgrep qutebrowser > /dev/null && qutebrowser ':config-source'
|
||||||
|
|
||||||
|
notify-send "Wallpaper and colorscheme changed, setting RGB value"
|
||||||
|
|
||||||
|
#run walcord
|
||||||
|
walcord
|
||||||
|
|
||||||
|
#set RGB last so it doesn't hang
|
||||||
|
python /home/Nicholai/scripts/pywal/pywal-openrgb.py
|
||||||
16
pywal/update-waybar-theme.sh
Executable file
16
pywal/update-waybar-theme.sh
Executable file
@ -0,0 +1,16 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Check if an image path is provided
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Usage: $0 /path/to/image"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Run pywal to generate the color scheme
|
||||||
|
wal -i "$1"
|
||||||
|
|
||||||
|
# Copy the generated Waybar CSS to your .config directory
|
||||||
|
cp "${HOME}/.cache/wal/colors-waybar.css" "${HOME}/.config/waybar/"
|
||||||
|
|
||||||
|
# Reload Waybar to apply the new theme
|
||||||
|
killall -SIGUSR2 waybar
|
||||||
23
pywal/wallpapermenu.sh
Executable file
23
pywal/wallpapermenu.sh
Executable file
@ -0,0 +1,23 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
FOLDER=~/Pictures/Wallpapers
|
||||||
|
SCRIPT=~/scripts/pywal/pywal16.sh
|
||||||
|
|
||||||
|
menu() {
|
||||||
|
CHOICE=$(nsxiv -otb $FOLDER/*) # nsxiv -o writes filename to stdout
|
||||||
|
|
||||||
|
case $CHOICE in
|
||||||
|
*.*) wal -i "$CHOICE" -o $SCRIPT
|
||||||
|
killall swaybg
|
||||||
|
swaybg -m fill -i "$CHOICE";;
|
||||||
|
*) exit 0 ;;
|
||||||
|
esac
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$#" in
|
||||||
|
0) menu;;
|
||||||
|
1) wal -i "$CHOICE" -o "$SCRIPT";;
|
||||||
|
2) wal -1 "$1" --theme $2 -o $SCRIPT ;;
|
||||||
|
*) exit 0 ;;
|
||||||
|
esac
|
||||||
|
|
||||||
130
sort_images_by_color.py
Normal file
130
sort_images_by_color.py
Normal file
@ -0,0 +1,130 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
"""
|
||||||
|
Sorts images in a directory by their average color and renames them
|
||||||
|
with a numeric prefix and a wallpaper-based name including the
|
||||||
|
image's average color hex code.
|
||||||
|
|
||||||
|
Dependencies:
|
||||||
|
- Pillow: `pip install Pillow`
|
||||||
|
- tqdm (optional, for progress bar): `pip install tqdm`
|
||||||
|
"""
|
||||||
|
|
||||||
|
import argparse
|
||||||
|
import colorsys
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
try:
|
||||||
|
from PIL import Image, UnidentifiedImageError
|
||||||
|
except ImportError:
|
||||||
|
sys.exit("Error: Pillow library not found. Please install it with 'pip install Pillow'")
|
||||||
|
|
||||||
|
try:
|
||||||
|
from tqdm import tqdm
|
||||||
|
except ImportError:
|
||||||
|
class tqdm:
|
||||||
|
def __init__(self, iterable, *args, **kwargs):
|
||||||
|
self.iterable = iterable
|
||||||
|
def __iter__(self):
|
||||||
|
return iter(self.iterable)
|
||||||
|
def __enter__(self):
|
||||||
|
return self
|
||||||
|
def __exit__(self, exc_type, exc_val, exc_tb):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
def get_average_color(image_path: Path) -> tuple[int, int, int] | None:
|
||||||
|
"""
|
||||||
|
Calculates the average color of an image by resizing it to a single pixel.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
image_path: The path to the image file.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
A tuple (r, g, b) representing the average color, or None if processing fails.
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
with Image.open(image_path) as img:
|
||||||
|
img = img.convert("RGB")
|
||||||
|
avg_color_img = img.resize((1, 1), Image.Resampling.LANCZOS)
|
||||||
|
return avg_color_img.getpixel((0, 0))
|
||||||
|
except UnidentifiedImageError:
|
||||||
|
print(f"Warning: Skipping unsupported or corrupt file: {image_path.name}")
|
||||||
|
return None
|
||||||
|
except Exception as e:
|
||||||
|
print(f"Warning: Could not process {image_path.name}: {e}")
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
parser = argparse.ArgumentParser(
|
||||||
|
description="Sort images by color and rename to 'XX_Wallpaper_<hex>.ext' format",
|
||||||
|
formatter_class=argparse.RawTextHelpFormatter
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"directory",
|
||||||
|
type=str,
|
||||||
|
help="Path to directory containing images to sort."
|
||||||
|
)
|
||||||
|
parser.add_argument(
|
||||||
|
"-n", "--dry-run",
|
||||||
|
action="store_true",
|
||||||
|
help="Perform a dry run without renaming any files."
|
||||||
|
)
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
target_dir = Path(args.directory).resolve()
|
||||||
|
|
||||||
|
if not target_dir.is_dir():
|
||||||
|
print(f"Error: Directory not found at '{target_dir}'")
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
image_extensions = {".png", ".jpg", ".jpeg"}
|
||||||
|
image_paths = sorted([
|
||||||
|
p for p in target_dir.iterdir()
|
||||||
|
if p.is_file() and p.suffix.lower() in image_extensions
|
||||||
|
])
|
||||||
|
|
||||||
|
if not image_paths:
|
||||||
|
print(f"No images with extensions ({', '.join(image_extensions)}) found in '{target_dir}'")
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
|
print(f"Found {len(image_paths)} images. Analyzing colors...")
|
||||||
|
|
||||||
|
image_data = []
|
||||||
|
for path in tqdm(image_paths, desc="Analyzing"):
|
||||||
|
rgb = get_average_color(path)
|
||||||
|
if rgb:
|
||||||
|
hsv = colorsys.rgb_to_hsv(rgb[0]/255.0, rgb[1]/255.0, rgb[2]/255.0)
|
||||||
|
hex_code = '{:02x}{:02x}{:02x}'.format(*rgb)
|
||||||
|
image_data.append({"path": path, "hsv": hsv, "hex": hex_code})
|
||||||
|
|
||||||
|
sorted_images = sorted(image_data, key=lambda x: x["hsv"])
|
||||||
|
padding = len(str(len(sorted_images)))
|
||||||
|
|
||||||
|
print(f"\nRenaming {len(sorted_images)} images...")
|
||||||
|
if args.dry_run:
|
||||||
|
print("--- DRY RUN --- (No files will be renamed)")
|
||||||
|
|
||||||
|
for i, data in enumerate(sorted_images, 1):
|
||||||
|
path = data["path"]
|
||||||
|
hex_code = data["hex"]
|
||||||
|
suffix = path.suffix.lower()
|
||||||
|
new_name = f"{i:0{padding}d}_Wallpaper_{hex_code}{suffix}"
|
||||||
|
new_path = path.with_name(new_name)
|
||||||
|
|
||||||
|
if new_path.exists():
|
||||||
|
print(f"Warning: '{new_path.name}' already exists; skipping rename of '{path.name}'.")
|
||||||
|
continue
|
||||||
|
|
||||||
|
print(f" '{path.name}' -> '{new_path.name}'")
|
||||||
|
if not args.dry_run:
|
||||||
|
path.rename(new_path)
|
||||||
|
|
||||||
|
print("\nDone.")
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
11
wallpapersync.sh
Executable file
11
wallpapersync.sh
Executable file
@ -0,0 +1,11 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
Repo="/home/Nicholai/Pictures/Wallpapers"
|
||||||
|
Dir_Wallpapers="/home/Nicholai/Nextcloud/Mini-Arch/Wallpaper-Repo/"
|
||||||
|
Script_Resort="/home/Nicholai/scripts/sort_images_by_color.py"
|
||||||
|
|
||||||
|
# 1. Resort wallpapers
|
||||||
|
python "$Script_Resort" "$Dir_Wallpapers"
|
||||||
|
|
||||||
|
# 3. sync new wallpapers in
|
||||||
|
rsync -a --delete "$Dir_Wallpapers"/ "$Repo"/
|
||||||
Loading…
x
Reference in New Issue
Block a user