NuvioStreaming/src/hooks/useStreamProviders.ts

146 lines
No EOL
4.8 KiB
TypeScript

import { useState, useEffect, useMemo, useCallback } from 'react';
import { stremioService } from '../services/stremioService';
import { Stream } from '../types/metadata';
import { logger } from '../utils/logger';
interface StreamGroups {
[addonId: string]: {
addonName: string;
streams: Stream[];
};
}
export const useStreamProviders = (
groupedStreams: StreamGroups,
episodeStreams: StreamGroups,
type: string,
loadingStreams: boolean,
loadingEpisodeStreams: boolean
) => {
const [selectedProvider, setSelectedProvider] = useState('all');
const [availableProviders, setAvailableProviders] = useState<Set<string>>(new Set());
const [loadingProviders, setLoadingProviders] = useState<{[key: string]: boolean}>({});
const [providerStatus, setProviderStatus] = useState<{
[key: string]: {
loading: boolean;
success: boolean;
error: boolean;
message: string;
timeStarted: number;
timeCompleted: number;
}
}>({});
const [providerLoadTimes, setProviderLoadTimes] = useState<{[key: string]: number}>({});
const [loadStartTime, setLoadStartTime] = useState(0);
// Update available providers when streams change - converted to useEffect
useEffect(() => {
const streams = type === 'series' ? episodeStreams : groupedStreams;
const providers = new Set(Object.keys(streams));
setAvailableProviders(providers);
}, [type, groupedStreams, episodeStreams]);
// Start tracking load time when loading begins - converted to useEffect
useEffect(() => {
if (loadingStreams || loadingEpisodeStreams) {
logger.log("⏱️ Stream loading started");
const now = Date.now();
setLoadStartTime(now);
setProviderLoadTimes({});
// Reset provider status - only for stremio addons
setProviderStatus({
'stremio': {
loading: true,
success: false,
error: false,
message: 'Loading...',
timeStarted: now,
timeCompleted: 0
}
});
// Also update the simpler loading state - only for stremio
setLoadingProviders({
'stremio': true
});
}
}, [loadingStreams, loadingEpisodeStreams]);
// Generate filter items for the provider selector
const filterItems = useMemo(() => {
const installedAddons = stremioService.getInstalledAddons();
const streams = type === 'series' ? episodeStreams : groupedStreams;
return [
{ id: 'all', name: 'All Providers' },
...Array.from(availableProviders)
.sort((a, b) => {
const indexA = installedAddons.findIndex(addon => addon.id === a);
const indexB = installedAddons.findIndex(addon => addon.id === b);
if (indexA !== -1 && indexB !== -1) return indexA - indexB;
if (indexA !== -1) return -1;
if (indexB !== -1) return 1;
return 0;
})
.map(provider => {
const addonInfo = streams[provider];
const installedAddon = installedAddons.find(addon => addon.id === provider);
let displayName = provider;
if (installedAddon) displayName = installedAddon.name;
else if (addonInfo?.addonName) displayName = addonInfo.addonName;
return { id: provider, name: displayName };
})
];
}, [availableProviders, type, episodeStreams, groupedStreams]);
// Filter streams to show only selected provider (or all)
const filteredSections = useMemo(() => {
const streams = type === 'series' ? episodeStreams : groupedStreams;
const installedAddons = stremioService.getInstalledAddons();
return Object.entries(streams)
.filter(([addonId]) => {
// If "all" is selected, show all providers
if (selectedProvider === 'all') {
return true;
}
// Otherwise only show the selected provider
return addonId === selectedProvider;
})
.sort(([addonIdA], [addonIdB]) => {
const indexA = installedAddons.findIndex(addon => addon.id === addonIdA);
const indexB = installedAddons.findIndex(addon => addon.id === addonIdB);
if (indexA !== -1 && indexB !== -1) return indexA - indexB;
if (indexA !== -1) return -1;
if (indexB !== -1) return 1;
return 0;
})
.map(([addonId, { addonName, streams }]) => ({
title: addonName,
addonId,
data: streams
}));
}, [selectedProvider, type, episodeStreams, groupedStreams]);
// Handler for changing the selected provider
const handleProviderChange = useCallback((provider: string) => {
setSelectedProvider(provider);
}, []);
return {
selectedProvider,
availableProviders,
loadingProviders,
providerStatus,
filterItems,
filteredSections,
handleProviderChange,
setLoadingProviders,
setProviderStatus
};
};