#!/usr/bin/env python3 """ Test download with file monitoring to see if files are actually created. This will watch /Volumes/Jellyfin Media/Music for new files during download. """ import socketio import time import os import json from pathlib import Path # Monitor the music directory MUSIC_DIR = "/Volumes/Jellyfin Media/Music" def get_music_files(): """Get all music files in the directory""" if not os.path.exists(MUSIC_DIR): return [] music_files = [] for root, dirs, files in os.walk(MUSIC_DIR): for file in files: if file.endswith(('.mp3', '.flac', '.m4a', '.wav')): full_path = os.path.join(root, file) stat = os.stat(full_path) music_files.append({ 'path': full_path, 'name': file, 'size': stat.st_size, 'modified': stat.st_mtime }) return music_files def test_download_with_monitoring(): print("šŸŽµ DOWNLOAD TEST WITH FILE MONITORING") print("=" * 60) print(f"šŸ“ Monitoring music directory: {MUSIC_DIR}") # Check if music directory exists if not os.path.exists(MUSIC_DIR): print(f"āŒ Music directory does not exist: {MUSIC_DIR}") return # Get initial file list print("\nšŸ“Š Getting initial file count...") initial_files = get_music_files() print(f" Initial files: {len(initial_files)}") # Connect to backend sio = socketio.Client() download_status = {} @sio.event def connect(): print("āœ… Connected to backend") @sio.event def search_results(data): print(f"šŸ” Search results received: {len(data.get('results', []))} items") if data.get('results'): first_result = data['results'][0] print(f" First result: '{first_result['name']}' by '{first_result['artist']}'") print(f" ID: {first_result.get('id', 'NO ID!')}") print(f" URL: {first_result['url']}") # Trigger download print(f"\nšŸ”½ Triggering download...") download_data = { 'url': first_result['url'], 'searchResult': first_result, 'name': first_result['name'], 'artist': first_result['artist'], 'type': first_result['type'], 'id': first_result.get('id') } print(f"šŸ“¤ Download request: {json.dumps(download_data, indent=2)}") sio.emit('download', download_data) @sio.event def update_status(data): print(f"\nšŸ“„ Download status update:") print(f" {json.dumps(data, indent=4)}") if data.get('history'): for item in data['history']: song_id = item.get('id', 'unknown') status = item.get('status', 'unknown') download_status[song_id] = status print(f" šŸ“Š {item.get('name', 'Unknown')}: {status}") @sio.event def disconnect(): print("āŒ Disconnected from backend") try: # Connect print("\nšŸ”Œ Connecting to backend...") sio.connect('http://localhost:5140') # Search print("\nšŸ” Searching for 'you lloyd'...") sio.emit('search', {'query': 'you lloyd', 'type': 'track'}) # Monitor for file changes print("\nā³ Monitoring for file changes...") start_time = time.time() check_interval = 2 # Check every 2 seconds max_wait = 30 # Wait up to 30 seconds while time.time() - start_time < max_wait: time.sleep(check_interval) # Check for new files current_files = get_music_files() new_files = [] for current_file in current_files: # Check if this file is new (not in initial list) is_new = True for initial_file in initial_files: if (current_file['path'] == initial_file['path'] and current_file['modified'] <= initial_file['modified']): is_new = False break if is_new: new_files.append(current_file) if new_files: print(f"\nšŸŽ‰ NEW FILES DETECTED!") for new_file in new_files: print(f" šŸ“ {new_file['name']}") print(f" Path: {new_file['path']}") print(f" Size: {new_file['size']} bytes") break else: elapsed = int(time.time() - start_time) print(f" ā° Waiting... {elapsed}/{max_wait} seconds (no new files yet)") if not new_files: print(f"\nāŒ NO NEW FILES CREATED after {max_wait} seconds") print(" This confirms downloads are not completing successfully") # Final status check print(f"\nšŸ“Š Final download status:") for song_id, status in download_status.items(): print(f" {song_id}: {status}") sio.disconnect() except Exception as e: print(f"šŸ’„ Error during test: {e}") if sio.connected: sio.disconnect() if __name__ == "__main__": test_download_with_monitoring()