tuanchris пре 4 месеци
родитељ
комит
c4ab20e177
2 измењених фајлова са 44 додато и 12 уклоњено
  1. 7 7
      main.py
  2. 37 5
      static/js/index.js

+ 7 - 7
main.py

@@ -424,17 +424,13 @@ async def list_theta_rho_files_with_metadata():
                 'coordinates_count': 0
             }
     
-    # Process files in parallel using asyncio
-    loop = asyncio.get_event_loop()
-    tasks = [loop.run_in_executor(executor, process_file, file_path) for file_path in files]
-    
-    # Instead of processing individual files, load the entire metadata cache at once
+    # Load the entire metadata cache at once (async)
     # This is much faster than 1000+ individual metadata lookups
     try:
         import json
         metadata_cache_path = "metadata_cache.json"
-        with open(metadata_cache_path, 'r') as f:
-            cache_data = json.load(f)
+        # Use async file reading to avoid blocking the event loop
+        cache_data = await asyncio.to_thread(lambda: json.load(open(metadata_cache_path, 'r')))
         cache_dict = cache_data.get('data', {})
         logger.debug(f"Loaded metadata cache with {len(cache_dict)} entries")
 
@@ -482,6 +478,10 @@ async def list_theta_rho_files_with_metadata():
     except Exception as e:
         logger.error(f"Failed to load metadata cache, falling back to slow method: {e}")
         # Fallback to original method if cache loading fails
+        # Create tasks only when needed
+        loop = asyncio.get_event_loop()
+        tasks = [loop.run_in_executor(executor, process_file, file_path) for file_path in files]
+
         for task in asyncio.as_completed(tasks):
             try:
                 result = await task

+ 37 - 5
static/js/index.js

@@ -673,13 +673,25 @@ async function loadPatterns(forceRefresh = false) {
                     metadataAbortController.abort();
                 }
                 
-                // Create new AbortController for this request
+                // Create new AbortController for this request with timeout
                 metadataAbortController = new AbortController();
-                
+
+                // Set a timeout to prevent hanging on slow Pi systems
+                const timeoutId = setTimeout(() => {
+                    metadataAbortController.abort();
+                    logMessage('Metadata loading timed out after 30 seconds', LOG_TYPE.WARNING);
+                }, 30000); // 30 second timeout
+
                 logMessage('Loading enhanced metadata...', LOG_TYPE.DEBUG);
                 const metadataResponse = await fetch('/list_theta_rho_files_with_metadata', {
-                    signal: metadataAbortController.signal
+                    signal: metadataAbortController.signal,
+                    headers: {
+                        'Cache-Control': 'no-cache'
+                    }
                 });
+
+                // Clear timeout if request succeeds
+                clearTimeout(timeoutId);
                 const patternsWithMetadata = await metadataResponse.json();
                 
                 // Store enhanced patterns data
@@ -697,11 +709,31 @@ async function loadPatterns(forceRefresh = false) {
                 metadataAbortController = null;
             } catch (metadataError) {
                 if (metadataError.name === 'AbortError') {
-                    logMessage('Metadata loading cancelled (navigating away)', LOG_TYPE.DEBUG);
+                    logMessage('Metadata loading cancelled or timed out', LOG_TYPE.WARNING);
                 } else {
                     logMessage(`Failed to load enhanced metadata: ${metadataError.message}`, LOG_TYPE.WARNING);
                 }
-                // No fallback needed - basic patterns already displayed
+
+                // Create basic metadata from file list to populate categories
+                if (allPatterns && allPatterns.length > 0) {
+                    allPatternsWithMetadata = allPatterns.map(pattern => {
+                        const pathParts = pattern.split('/');
+                        const category = pathParts.length > 1 ? pathParts.slice(0, -1).join('/') : 'root';
+                        const fileName = pathParts[pathParts.length - 1].replace('.thr', '');
+                        return {
+                            path: pattern,
+                            name: fileName,
+                            category: category,
+                            date_modified: 0,
+                            coordinates_count: 0
+                        };
+                    });
+
+                    // Update category filter with basic data
+                    updateBrowseCategoryFilter();
+                    logMessage('Using basic category data (metadata unavailable)', LOG_TYPE.INFO);
+                }
+
                 metadataAbortController = null;
             }
         }, 100); // Small delay to let initial render complete