catalogs / main.py
MyanmarSwe's picture
Update main.py
a4b3748 verified
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]}