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