63 lines
2.2 KiB
Python
Executable File
63 lines
2.2 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
import os
|
|
import json
|
|
import sys
|
|
|
|
def scan_wallpapers():
|
|
search_dirs = [
|
|
os.path.expanduser('~/Pictures/Wallpapers'),
|
|
os.path.expanduser('~/.config/quickshell/wallpapers'),
|
|
'/usr/share/wallpapers',
|
|
'/usr/share/backgrounds'
|
|
]
|
|
res = []
|
|
seen_realpaths = set()
|
|
seen_file_signatures = set()
|
|
|
|
for base_dir in search_dirs:
|
|
if not os.path.exists(base_dir):
|
|
continue
|
|
for root, dirs, files in os.walk(base_dir):
|
|
for filename in files:
|
|
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.webp', '.svg')):
|
|
full_path = os.path.join(root, filename)
|
|
real_path = os.path.realpath(full_path)
|
|
|
|
if real_path in seen_realpaths:
|
|
continue
|
|
|
|
try:
|
|
file_size = os.path.getsize(full_path)
|
|
except Exception:
|
|
file_size = 0
|
|
|
|
# Determine parent variant name
|
|
folder_name = os.path.basename(root)
|
|
if folder_name.lower() in ("contents", "screenshots", "images"):
|
|
parent_folder = os.path.basename(os.path.dirname(root))
|
|
variant_name = parent_folder if parent_folder and parent_folder != os.path.basename(base_dir) else os.path.splitext(filename)[0]
|
|
elif root != base_dir:
|
|
variant_name = folder_name
|
|
else:
|
|
variant_name = os.path.splitext(filename)[0]
|
|
|
|
sig = (variant_name.lower(), filename.lower(), file_size)
|
|
|
|
if sig in seen_file_signatures:
|
|
continue
|
|
|
|
seen_realpaths.add(real_path)
|
|
seen_file_signatures.add(sig)
|
|
|
|
res.append({
|
|
'variant': variant_name,
|
|
'name': filename,
|
|
'path': full_path
|
|
})
|
|
|
|
res.sort(key=lambda x: (x['variant'].lower(), x['name'].lower()))
|
|
print(json.dumps(res), flush=True)
|
|
|
|
if __name__ == '__main__':
|
|
scan_wallpapers()
|