diff --git a/local-scrapers-repo b/local-scrapers-repo index 22ed3a1c..b9c64771 160000 --- a/local-scrapers-repo +++ b/local-scrapers-repo @@ -1 +1 @@ -Subproject commit 22ed3a1c96ed2a8adf5bf9f277acd9d8c53c069c +Subproject commit b9c6477161cd16f8c3b2c040252186adb73074f3 diff --git a/src/screens/PluginsScreen.tsx b/src/screens/PluginsScreen.tsx index d4a4f33b..247d94d5 100644 --- a/src/screens/PluginsScreen.tsx +++ b/src/screens/PluginsScreen.tsx @@ -620,7 +620,8 @@ const PluginsScreen: React.FC = () => { {hasRepository && repositoryUrl && ( Current Repository: - {repositoryUrl} + {localScraperService.getRepositoryName()} + {repositoryUrl} )} @@ -788,9 +789,9 @@ const PluginsScreen: React.FC = () => { - Stream Display Mode + Group Plugin Streams - {settings.streamDisplayMode === 'separate' ? 'Show each provider separately' : 'Group all providers under one name'} + When enabled, all plugin streams are grouped under "{localScraperService.getRepositoryName()}". When disabled, each plugin shows as a separate provider. { {/* About */} - About Local Scrapers + About Plugins - Local scrapers are JavaScript modules that can search for streaming links from various sources. + Plugins are JavaScript modules that can search for streaming links from various sources. They run locally on your device and can be installed from trusted repositories. diff --git a/src/screens/StreamsScreen.tsx b/src/screens/StreamsScreen.tsx index 7b77c134..ecfbfc33 100644 --- a/src/screens/StreamsScreen.tsx +++ b/src/screens/StreamsScreen.tsx @@ -924,7 +924,7 @@ export const StreamsScreen = () => { // Add single grouped plugins chip if there are any plugins if (pluginProviders.length > 0) { - filterChips.push({ id: 'grouped-plugins', name: 'Plugins' }); + filterChips.push({ id: 'grouped-plugins', name: localScraperService.getRepositoryName() }); } return filterChips; @@ -1028,7 +1028,7 @@ export const StreamsScreen = () => { } if (pluginStreams.length > 0) { sections.push({ - title: pluginNames.join(', '), + title: localScraperService.getRepositoryName(), addonId: 'grouped-plugins', data: pluginStreams }); diff --git a/src/services/localScraperService.ts b/src/services/localScraperService.ts index d2c95fc2..7a087de2 100644 --- a/src/services/localScraperService.ts +++ b/src/services/localScraperService.ts @@ -52,6 +52,7 @@ class LocalScraperService { private installedScrapers: Map = new Map(); private scraperCode: Map = new Map(); private repositoryUrl: string = ''; + private repositoryName: string = ''; private initialized: boolean = false; private constructor() { @@ -175,6 +176,11 @@ class LocalScraperService { return this.repositoryUrl; } + // Get repository name + getRepositoryName(): string { + return this.repositoryName || 'Plugins'; + } + // Fetch and install scrapers from repository async refreshRepository(): Promise { await this.ensureInitialized(); @@ -206,6 +212,11 @@ class LocalScraperService { }); const manifest: ScraperManifest = response.data; + // Store repository name from manifest + if (manifest.name) { + this.repositoryName = manifest.name; + } + logger.log('[LocalScraperService] getAvailableScrapers - Raw manifest data:', JSON.stringify(manifest, null, 2)); logger.log('[LocalScraperService] getAvailableScrapers - Manifest scrapers count:', manifest.scrapers?.length || 0); @@ -354,6 +365,11 @@ class LocalScraperService { }); const manifest: ScraperManifest = response.data; + // Store repository name from manifest + if (manifest.name) { + this.repositoryName = manifest.name; + } + // Return scrapers from manifest, respecting manifest's enabled field const availableScrapers = manifest.scrapers.map(scraperInfo => { const installedScraper = this.installedScrapers.get(scraperInfo.id); diff --git a/src/services/stremioService.ts b/src/services/stremioService.ts index 6914a62e..075614f2 100644 --- a/src/services/stremioService.ts +++ b/src/services/stremioService.ts @@ -216,46 +216,54 @@ class StremioService { // Ensure Cinemeta is always installed as a pre-installed addon const cinemetaId = 'com.linvo.cinemeta'; if (!this.installedAddons.has(cinemetaId)) { - const cinemetaManifest: Manifest = { - id: cinemetaId, - name: 'Cinemeta', - version: '3.0.13', - description: 'Provides metadata for movies and series from TheTVDB, TheMovieDB, etc.', - url: 'https://v3-cinemeta.strem.io', - originalUrl: 'https://v3-cinemeta.strem.io/manifest.json', - types: ['movie', 'series'], - catalogs: [ - { - type: 'movie', - id: 'top', - name: 'Top Movies', - extraSupported: ['search', 'genre', 'skip'] - }, - { - type: 'series', - id: 'top', - name: 'Top Series', - extraSupported: ['search', 'genre', 'skip'] + try { + const cinemetaManifest = await this.getManifest('https://v3-cinemeta.strem.io/manifest.json'); + this.installedAddons.set(cinemetaId, cinemetaManifest); + logger.log('✅ Cinemeta pre-installed as default addon with full manifest'); + } catch (error) { + logger.error('Failed to fetch Cinemeta manifest, using fallback:', error); + // Fallback to minimal manifest if fetch fails + const fallbackManifest: Manifest = { + id: cinemetaId, + name: 'Cinemeta', + version: '3.0.13', + description: 'Provides metadata for movies and series from TheTVDB, TheMovieDB, etc.', + url: 'https://v3-cinemeta.strem.io', + originalUrl: 'https://v3-cinemeta.strem.io/manifest.json', + types: ['movie', 'series'], + catalogs: [ + { + type: 'movie', + id: 'top', + name: 'Popular', + extraSupported: ['search', 'genre', 'skip'] + }, + { + type: 'series', + id: 'top', + name: 'Popular', + extraSupported: ['search', 'genre', 'skip'] + } + ], + resources: [ + { + name: 'catalog', + types: ['movie', 'series'], + idPrefixes: ['tt'] + }, + { + name: 'meta', + types: ['movie', 'series'], + idPrefixes: ['tt'] + } + ], + behaviorHints: { + configurable: false } - ], - resources: [ - { - name: 'catalog', - types: ['movie', 'series'], - idPrefixes: ['tt'] - }, - { - name: 'meta', - types: ['movie', 'series'], - idPrefixes: ['tt'] - } - ], - behaviorHints: { - configurable: false - } - }; - this.installedAddons.set(cinemetaId, cinemetaManifest); - logger.log('✅ Cinemeta pre-installed as default addon'); + }; + this.installedAddons.set(cinemetaId, fallbackManifest); + logger.log('✅ Cinemeta pre-installed with fallback manifest'); + } } // Load addon order if exists