catalogs / main.py
MyanmarSwe's picture
Update main.py
a4b3748 verified
Raw History Blame Contribute Delete
4.36 kB
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]}