max_headroom/modules/app_launcher.py
maglore9900 3f849acdc3 added windows app launcher
first it indexes the applications on the system, and will do this every five days while running. then uses fuzzy search to find apps.
2024-08-28 13:04:52 -04:00

67 lines
2.4 KiB
Python

import os
import json
import subprocess
from difflib import get_close_matches
from datetime import datetime, timedelta
class AppLauncher:
def __init__(self, search_paths=None, index_file='app_index.json'):
if search_paths is None:
search_paths = [
r'C:\Program Files',
r'C:\Program Files (x86)',
r'C:\Windows\System32'
]
self.search_paths = search_paths
self.index_file = index_file
self.index = {}
self.load_index()
def index_applications(self):
app_index = {}
current_date = datetime.now().strftime('%Y-%m-%d')
# Walk through the directories and index all executables
for path in self.search_paths:
for root, dirs, files in os.walk(path):
for file in files:
if file.endswith('.exe'):
app_name = file.lower()
app_path = os.path.join(root, file)
app_index[app_name] = {'path': app_path, 'date_indexed': current_date}
# Save the index to a JSON file
with open(self.index_file, 'w') as f:
json.dump(app_index, f, indent=4)
self.index = app_index
print(f"Indexing complete. {len(app_index)} applications indexed.")
def load_index(self):
try:
with open(self.index_file, 'r') as f:
self.index = json.load(f)
# Check if the index is older than 5 days
any_entry = next(iter(self.index.values()))
date_indexed = datetime.strptime(any_entry['date_indexed'], '%Y-%m-%d')
if datetime.now() - date_indexed > timedelta(days=5):
print("Index is older than 5 days. Reindexing...")
self.index_applications()
except (FileNotFoundError, ValueError, KeyError):
# If the index file doesn't exist or is corrupted, reindex
print("Index file not found or corrupted. Creating new index...")
self.index_applications()
def find_and_open_app(self, app_name):
match = get_close_matches(app_name.lower(), self.index.keys(), n=1, cutoff=0.6)
if match:
app_path = self.index[match[0]]['path']
subprocess.run(app_path)
print(f"Opening {match[0]} at {app_path}")
else:
print(f"No matching application found for '{app_name}'")