Spaces:
Sleeping
Sleeping
| 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" | |
| async def sync_route(req: Request): | |
| data = await req.json() | |
| return process_sync(data) | |
| 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"}]} | |
| ] | |
| } | |
| 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]} | |
| 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} | |
| 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]} |