CCCPaste

b341a7da7d17c

import os
import subprocess
import wmi
import time
import re
import tempfile

VLC_PATH = r"C:\Program Files\VideoLAN\VLC\vlc.exe"

def get_sort_key(filename):
"""
Extracts the leading number for numerical sorting.
Handles '1 song', '10 song', '2 song' correctly.
"""
# Look for any digit(s) at the very start of the filename
match = re.match(r'^(\d+)', filename)
if match:
# Converting to int ensures 2 comes before 12
return int(match.group(1))
return 999999

def play_in_vlc(drive_letter):
print(f"Scanning {drive_letter} for MP3s...")
mp3_paths = []

for root, dirs, files in os.walk(drive_letter):
for file in files:
if file.lower().endswith(".mp3"):
mp3_paths.append(os.path.join(root, file))

if not mp3_paths:
return None

# SORTING LOGIC:
# This sorts by the integer value of the leading number.
mp3_paths.sort(key=lambda x: get_sort_key(os.path.basename(x)))

with tempfile.NamedTemporaryFile(mode='w', suffix='.m3u', delete=False) as f:
for path in mp3_paths:
f.write(path + '\n')
playlist_path = f.name

print(f"Playing {len(mp3_paths)} files in numerical order.")
return subprocess.Popen([VLC_PATH, playlist_path])

def monitor_drive():
c = wmi.WMI()
watcher = c.Win32_LogicalDisk.watch_for("creation")
vlc_process = None

print("System active. Waiting for CD...")

while True:
try:
# Short timeout allows us to check for ejection frequently
new_drive = watcher(timeout_ms=2000)
if new_drive.DriveType == 4:
drive_path = f"{new_drive.DeviceID}\\"
time.sleep(3)

if vlc_process and vlc_process.poll() is None:
vlc_process.terminate()

vlc_process = play_in_vlc(drive_path)

except wmi.x_wmi_timed_out:
# Check if disc was removed
if vlc_process and vlc_process.poll() is None:
# If no CD drives have media, the disc was likely ejected
ready_drives = [d for d in c.Win32_LogicalDisk(DriveType=4) if d.Size is not None]
if not ready_drives:
print("Disc ejected. Stopping playback...")
vlc_process.terminate()
vlc_process = None
except Exception as e:
time.sleep(1)

if __name__ == "__main__":
monitor_drive()