Update main.py with a new script

This commit is contained in:
nmemmert committed 2025-11-15 08:49:41 -05:00
1 parent 2a34d0cc93
commit 345c40f40d
1 file changed
+75 -6
+75 -6
View File
@@ -11,7 +11,6 @@ import time
from selenium import webdriver from selenium import webdriver
from selenium.webdriver.chrome.options import Options from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
from webdriver_manager.chrome import ChromeDriverManager from webdriver_manager.chrome import ChromeDriverManager
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
import os import os
@@ -19,8 +18,10 @@ from plexapi.myplex import MyPlexAccount
from mutagen.easyid3 import EasyID3 from mutagen.easyid3 import EasyID3
import re import re
from datetime import datetime from datetime import datetime
import json
import subprocess
# Configuration # Configuration (defaults, will be overridden by config.json)
PLEX_TOKEN = 'pU-m3HWYUZU6iXJFhJyA' # Your Plex.tv token PLEX_TOKEN = 'pU-m3HWYUZU6iXJFhJyA' # Your Plex.tv token
SERVER_IP = '172.16.16.106' # Your local server IP SERVER_IP = '172.16.16.106' # Your local server IP
PLAYLIST_NAME = 'Journey FM Recently Played' PLAYLIST_NAME = 'Journey FM Recently Played'
@@ -52,6 +53,7 @@ def scrape_recently_played():
html = driver.page_source html = driver.page_source
driver.quit() driver.quit()
tweet = scrape(tweet_code)
# Optional: save HTML to file for debugging (comment out if not needed) # Optional: save HTML to file for debugging (comment out if not needed)
# with open('page.html', 'w', encoding='utf-8') as f: # with open('page.html', 'w', encoding='utf-8') as f:
# f.write(html) # f.write(html)
@@ -95,7 +97,7 @@ def scrape_recently_played():
def normalize_string(s): def normalize_string(s):
"""Normalize string for comparison""" """Normalize string for comparison"""
return re.sub(r'[^\w\s]', '', s).lower().strip() return re.sub(r'[^\\w\\s]', '', s).lower().strip()
def find_song_in_library(artist, title, library_path): def find_song_in_library(artist, title, library_path):
"""Check if song exists in local library""" """Check if song exists in local library"""
@@ -131,7 +133,7 @@ def create_playlist_in_plex(plex, songs, playlist_name):
continue continue
# Skip entries that are ONLY punctuation (but allow titles with punctuation in them) # Skip entries that are ONLY punctuation (but allow titles with punctuation in them)
if re.match(r'^[!?\s]+$', clean_title): if re.match(r'^[!?\\\\s]+$', clean_title):
continue continue
# Remove only ! and ? for searching, but keep apostrophes # Remove only ! and ? for searching, but keep apostrophes
@@ -152,7 +154,7 @@ def create_playlist_in_plex(plex, songs, playlist_name):
search_artist_lower = search_artist.lower() search_artist_lower = search_artist.lower()
# Clean featured artists from search (e.g., "W/ Emerson Day", "feat. Someone") # Clean featured artists from search (e.g., "W/ Emerson Day", "feat. Someone")
search_artist_main = re.sub(r'\s+(w/|feat\.|featuring|ft\.).*', '', search_artist_lower).strip() search_artist_main = re.sub(r'\s+(w/|feat\.||featuring|ft\.).*', '', search_artist_lower).strip()
# Normalize & and + in track artist as well # Normalize & and + in track artist as well
track_artist = re.sub(r'\s*[&+]\s*', ' and ', track_artist) track_artist = re.sub(r'\s*[&+]\s*', ' and ', track_artist)
@@ -199,7 +201,74 @@ def create_playlist_in_plex(plex, songs, playlist_name):
else: else:
print("No matching tracks found in Plex.") print("No matching tracks found in Plex.")
def prompt_for_config():
"""Prompt user for configuration variables"""
print("Configuration not found. Please provide the following:")
plex_token = input("Enter your Plex token: ").strip()
server_ip = input("Enter your Plex server IP: ").strip()
playlist_name = input("Enter the playlist name: ").strip()
config = {
'PLEX_TOKEN': plex_token,
'SERVER_IP': server_ip,
'PLAYLIST_NAME': playlist_name
}
with open('config.json', 'w') as f:
json.dump(config, f)
return config
def prompt_for_scheduler():
"""Prompt user for scheduler setup"""
setup = input("Do you want to set up a scheduled task? (y/n): ").strip().lower()
if setup != 'y':
return None
print("Choose schedule type:")
print("1. Interval (e.g., every 15 minutes)")
print("2. At startup")
print("3. Both")
choice = input("Enter choice (1/2/3): ").strip()
if choice == '1':
interval = int(input("Enter interval number: ").strip())
unit = input("Enter unit (Minutes/Hours/Days): ").strip()
return {'Type': 'Interval', 'Interval': interval, 'Unit': unit}
elif choice == '2':
return {'Type': 'Startup'}
elif choice == '3':
return {'Type': 'Both'}
else:
print("Invalid choice.")
return None
def setup_scheduler(params):
"""Run the setup_scheduler.ps1 with parameters"""
cmd = ['powershell.exe', '-File', 'setup_scheduler.ps1']
for k, v in params.items():
cmd.extend(['-' + k, str(v)])
try:
subprocess.run(cmd, check=True)
print("Scheduler setup completed.")
except subprocess.CalledProcessError as e:
print(f"Error setting up scheduler: {e}")
def main(): def main():
global PLEX_TOKEN, SERVER_IP, PLAYLIST_NAME
# Load or prompt for config
if os.path.exists('config.json'):
with open('config.json', 'r') as f:
config = json.load(f)
PLEX_TOKEN = config.get('PLEX_TOKEN', PLEX_TOKEN)
SERVER_IP = config.get('SERVER_IP', SERVER_IP)
PLAYLIST_NAME = config.get('PLAYLIST_NAME', PLAYLIST_NAME)
else:
config = prompt_for_config()
PLEX_TOKEN = config['PLEX_TOKEN']
SERVER_IP = config['SERVER_IP']
PLAYLIST_NAME = config['PLAYLIST_NAME']
# Prompt for scheduler setup
sched_params = prompt_for_scheduler()
if sched_params:
setup_scheduler(sched_params)
# Log start time # Log start time
start_time = datetime.now() start_time = datetime.now()
print(f"\n{'='*60}") print(f"\n{'='*60}")
@@ -257,4 +326,4 @@ def main():
print(f"{'='*60}\n") print(f"{'='*60}\n")
if __name__ == '__main__': if __name__ == '__main__':
main() main()