Spaces:
Paused
Paused
| 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`); | |