fixed cinemeta preinstalled

This commit is contained in:
tapframe 2025-07-29 01:46:57 +05:30
parent 84689a9ba7
commit df89c16246
5 changed files with 72 additions and 47 deletions

@ -1 +1 @@
Subproject commit 22ed3a1c96ed2a8adf5bf9f277acd9d8c53c069c
Subproject commit b9c6477161cd16f8c3b2c040252186adb73074f3

View file

@ -620,7 +620,8 @@ const PluginsScreen: React.FC = () => {
{hasRepository && repositoryUrl && (
<View style={[styles.currentRepoContainer, !settings.enableLocalScrapers && styles.disabledContainer]}>
<Text style={[styles.currentRepoLabel, !settings.enableLocalScrapers && styles.disabledText]}>Current Repository:</Text>
<Text style={[styles.currentRepoUrl, !settings.enableLocalScrapers && styles.disabledText]}>{repositoryUrl}</Text>
<Text style={[styles.currentRepoUrl, !settings.enableLocalScrapers && styles.disabledText]}>{localScraperService.getRepositoryName()}</Text>
<Text style={[styles.currentRepoUrl, !settings.enableLocalScrapers && styles.disabledText, { fontSize: 12, opacity: 0.7, marginTop: 4 }]}>{repositoryUrl}</Text>
</View>
)}
@ -788,9 +789,9 @@ const PluginsScreen: React.FC = () => {
<View style={styles.settingRow}>
<View style={styles.settingInfo}>
<Text style={[styles.settingTitle, !settings.enableLocalScrapers && styles.disabledText]}>Stream Display Mode</Text>
<Text style={[styles.settingTitle, !settings.enableLocalScrapers && styles.disabledText]}>Group Plugin Streams</Text>
<Text style={[styles.settingDescription, !settings.enableLocalScrapers && styles.disabledText]}>
{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.
</Text>
</View>
<Switch
@ -845,9 +846,9 @@ const PluginsScreen: React.FC = () => {
{/* About */}
<View style={[styles.section, styles.lastSection]}>
<Text style={styles.sectionTitle}>About Local Scrapers</Text>
<Text style={styles.sectionTitle}>About Plugins</Text>
<Text style={styles.infoText}>
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.
</Text>
</View>

View file

@ -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
});

View file

@ -52,6 +52,7 @@ class LocalScraperService {
private installedScrapers: Map<string, ScraperInfo> = new Map();
private scraperCode: Map<string, string> = 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<void> {
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);

View file

@ -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