Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- 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()
Advertisement