ramarama / main.js
SteveCelticus's picture
Upload 4 files
833cac3 verified
import pkg from 'stremio-addon-sdk';
import seriesCatalog from './rama_series.js';
import { getMeta, getEpisodes } from './episodes.js';
const { addonBuilder, serveHTTP } = pkg;
const META_CACHE_TTL = 600000;
const manifest = {
"id": "community.ramaorientalfansub",
"version": "1.0.6",
"name": "Rama Oriental Fansub +",
"description": "Addon migliorato con scraper avanzato",
"catalogs": [{
"type": "kdrama",
"id": "rama_series",
"name": "Serie Coreane",
"extra": [
{ "name": "search", "isRequired": false },
{ "name": "skip", "isRequired": false }
]
}],
"resources": ["catalog", "meta", "stream"],
"types": ["series"],
"logo": "https://i.imgur.com/i7VdVv7.png",
"background": "https://i.imgur.com/mtsxMk7.jpeg"
};
const builder = new addonBuilder(manifest);
const metaCache = new Map();
builder.defineStreamHandler(async ({ type, id }) => {
try {
if (type !== "series") return { streams: [] };
let meta = metaCache.get(id);
if (!meta) {
const metaResult = await getMeta(id);
if (metaResult && metaResult.meta) {
meta = metaResult.meta;
metaCache.set(id, meta);
} else {
console.warn(`Nessun metadato trovato per ${id}`);
return { streams: [] };
}
}
if (!meta.episodes) {
console.log(`Caricamento episodi per ${id}`);
const episodes = await getEpisodes(meta.seriesLink, $);
meta.episodes = episodes
metaCache.set(id, meta); // Aggiorna la cache con gli episodi
}
if (meta.episodes) {
return {
streams: meta.episodes?.flatMap(ep =>
ep.streams.map(stream => ({
title: `${ep.title} - ${stream.title}`,
url: stream.url,
type: "video/mp4",
behaviorHints: { bingeGroup: id }
}))
)
};
} else {
console.warn(`Nessun episodio trovato per ${id}`);
return { streams: [] };
}
} catch (error) {
console.error(`Handler Error: ${error.message}`);
return { streams: [] };
}
});
builder.defineCatalogHandler(async (args) => {
if (args.type === 'kdrama' && args.id === 'rama_series') {
return seriesCatalog(args);
}
return { metas: [] };
});
builder.defineMetaHandler(async (args) => {
let meta = metaCache.get(args.id);
if (!meta) {
try {
const metaResult = await getMeta(args.id);
if (metaResult && metaResult.meta) {
meta = metaResult.meta;
metaCache.set(args.id, meta);
} else {
console.warn(`Nessun metadato trovato per ${args.id}`);
return { meta: null };
}
} catch (error) {
console.error(`Errore nel caricamento dei metadati per ${args.id}:`, error);
return { meta: null };
}
}
return { meta: { ...meta, extra: meta.extra } };
});
serveHTTP(builder.getInterface(), { port: 7000 });
console.log(`Addon server is running at http://localhost:7000/manifest.json`);