import os from fastapi import FastAPI, Request from fastapi.middleware.cors import CORSMiddleware from pymongo import MongoClient, DESCENDING from sync import process_sync app = FastAPI() app.add_middleware(CORSMiddleware, allow_origins=["*"]) client = MongoClient(os.environ.get("MONGODB_URI")) db = client['myanmarswe_cinema'] metas_col, streams_col, users_col = db['metas'], db['streams'], db['users'] def is_user_valid(key): user = users_col.find_one({"key": key}) return user and user.get("status") == "active" @app.post("/sync-data") async def sync_route(req: Request): data = await req.json() return process_sync(data) @app.get("/{user_key}/manifest.json") def manifest(user_key: str): valid = is_user_valid(user_key) return { "id": "com.myanmarswe.pro", "version": "3.2.0", "name": f"MyanmarSwe Cinema {'πŸ’Ž' if valid else '⚠️'}", "resources": ["catalog", "meta", "stream"], "types": ["movie", "series"], "idPrefixes": ["tmdb:", "tmdb_col:"], "catalogs": [ {"type": "movie", "id": "mswe_m", "name": "MyanmarSwe Movies", "extra": [{"name": "search"}, {"name": "genre"}]}, {"type": "movie", "id": "mswe_col", "name": "MyanmarSwe Movie Collections"}, # TV Show မှာ မပေါ်ထောင် type: "movie" α€•α€Όα€±α€¬α€„α€Ία€Έα€‘α€¬α€Έα€žα€Šα€Ί {"type": "series", "id": "mswe_s", "name": "MyanmarSwe TV Shows", "extra": [{"name": "search"}, {"name": "genre"}]} ] } @app.get("/{user_key}/catalog/{m_type}/{cat_id}.json") @app.get("/{user_key}/catalog/{m_type}/{cat_id}/{extra}.json") def catalog(user_key: str, m_type: str, cat_id: str, extra: str = None): if not is_user_valid(user_key): return {"metas": []} query = {"id": {"$regex": "^tmdb_col:"}} if cat_id == "mswe_col" else {"type": m_type} if extra: params = dict(x.split('=') for x in extra.split('&') if '=' in x) if "search" in params: s = params["search"] query["$or"] = [{"name": {"$regex": s, "$options": "i"}}, {"releaseInfo": s}] if "genre" in params: query["genres"] = params["genre"] cursor = metas_col.find(query).sort("updated_at", DESCENDING).limit(100) return {"metas": [{ "id": m["id"], "type": m.get("type", m_type), "name": m["name"], "poster": m["poster"], "logo": m.get("logo"), "description": m.get("description"), "releaseInfo": m.get("releaseInfo"), "imdbRating": m.get("imdbRating") } for m in cursor]} @app.get("/{user_key}/meta/{m_type}/{meta_id}.json") def meta(user_key: str, m_type: str, meta_id: str): if not is_user_valid(user_key): return {"meta": {}} m = metas_col.find_one({"id": meta_id}) if not m: return {"meta": {}} m.pop("_id", None) # Stremio UI α€™α€Ύ α€œα€€α€Ία€α€Άα€žα€±α€¬ Meta Object α€α€Šα€Ία€†α€±α€¬α€€α€Ία€α€Όα€„α€Ία€Έ res = { "id": m["id"], "type": m["type"], "name": m["name"], "poster": m["poster"], "background": m.get("background"), "logo": m.get("logo"), "description": m.get("description"), "cast": m.get("cast", []), "director": m.get("director", []), "runtime": m.get("runtime", ""), # Runtime α€€α€­α€― α€•α€Όα€”α€Ία€‘α€Šα€·α€Ία€•α€±α€Έα€‘α€¬α€Έα€žα€Šα€Ί "genres": m.get("genres", []), "releaseInfo": m.get("releaseInfo"), "imdbRating": m.get("imdbRating"), "videos": m.get("videos", []) } return {"meta": res} @app.get("/{user_key}/stream/{m_type}/{id}.json") def stream(user_key: str, m_type: str, id: str): if not is_user_valid(user_key): return {"streams": []} parts = id.split(":") if id.startswith("tmdb_col:"): col = metas_col.find_one({"id": f"tmdb_col:{parts[1]}"}) target = next((v for v in col["videos"] if v["season"] == int(parts[2]) and v["episode"] == int(parts[3])), None) if target: streams = list(streams_col.find({"tmdb_id": str(target["movie_id"])})) return {"streams": [{"name": "MS Stream πŸ’Ž", "url": s["url"]} for s in streams]} query = {"tmdb_id": parts[1]} if len(parts) == 4: query.update({"season": int(parts[2]), "episode": int(parts[3])}) streams = list(streams_col.find(query)) return {"streams": [{"name": "MS Stream πŸ’Ž", "url": s["url"]} for s in streams]}