diff --git a/src/hooks/useMetadata.ts b/src/hooks/useMetadata.ts index f1ffc711..d464c311 100644 --- a/src/hooks/useMetadata.ts +++ b/src/hooks/useMetadata.ts @@ -135,15 +135,10 @@ export const useMetadata = ({ id, type }: UseMetadataProps): UseMetadataReturn = } else if (streams && addonId && addonName) { logger.log(`✅ [${logPrefix}:${sourceName}] Received ${streams.length} streams from ${addonName} (${addonId}) after ${processTime}ms`); - // Log the raw streams received for this addon - logger.log(`📦 [${logPrefix}:${sourceName}] Raw streams for ${addonName} (${addonId}):`, JSON.stringify(streams.slice(0, 2), null, 2)); // Log first 2 raw streams - if (streams.length > 0) { // Use the streams directly as they are already processed by stremioService const updateState = (prevState: GroupedStreams): GroupedStreams => { logger.log(`🔄 [${logPrefix}:${sourceName}] Updating state for addon ${addonName} (${addonId})`); - // Log the streams being added to state - logger.log(`💾 [${logPrefix}:${sourceName}] Adding processed streams for ${addonName} (${addonId}) to state:`, JSON.stringify(streams.slice(0, 2), null, 2)); // Log first 2 processed streams return { ...prevState, [addonId]: { diff --git a/src/services/stremioService.ts b/src/services/stremioService.ts index d2dd0580..ab28bf68 100644 --- a/src/services/stremioService.ts +++ b/src/services/stremioService.ts @@ -552,8 +552,8 @@ class StremioService { // Find addons that provide streams and sort them by installation order const streamAddons = addons .filter(addon => { - if (!addon.resources) { - logger.log(`⚠️ [getStreams] Addon ${addon.id} has no resources`); + if (!addon.resources || !Array.isArray(addon.resources)) { + logger.log(`⚠️ [getStreams] Addon ${addon.id} has no valid resources array`); return false; } @@ -562,32 +562,25 @@ class StremioService { let hasStreamResource = false; - // Handle both resource formats: - // 1. Standard format: array of ResourceObjects with name and types properties - // 2. Simple format: string array ["stream"] with separate types array in the addon - - // Check for standard format (array of objects) - if (addon.resources.length > 0 && typeof addon.resources[0] === 'object') { - // Type-safe check for standard format (objects with name/types) - hasStreamResource = addon.resources.some( - resource => { - if (typeof resource === 'object' && resource !== null) { - const typedResource = resource as ResourceObject; - return typedResource.name === 'stream' && - Array.isArray(typedResource.types) && - typedResource.types.includes(type); - } - return false; + // Iterate through the resources array, checking each element + for (const resource of addon.resources) { + // Check if the current element is a ResourceObject + if (typeof resource === 'object' && resource !== null && 'name' in resource) { + const typedResource = resource as ResourceObject; + if (typedResource.name === 'stream' && + Array.isArray(typedResource.types) && + typedResource.types.includes(type)) { + hasStreamResource = true; + break; // Found the stream resource object, no need to check further } - ); - } - // Check for simple format (string array) - else if (Array.isArray(addon.resources) && addon.types) { - // Check if resources array contains 'stream' and types array includes the desired type - hasStreamResource = - (addon.resources as unknown as string[]).includes('stream') && - Array.isArray(addon.types) && - addon.types.includes(type); + } + // Check if the element is the simple string "stream" AND the addon has a top-level types array + else if (typeof resource === 'string' && resource === 'stream' && addon.types) { + if (Array.isArray(addon.types) && addon.types.includes(type)) { + hasStreamResource = true; + break; // Found the simple stream resource string and type support + } + } } if (!hasStreamResource) {