From b969b7e5afb960c7b26528757541399d69e173b8 Mon Sep 17 00:00:00 2001 From: KiraStream Date: Tue, 19 May 2026 14:43:31 +0000 Subject: [PATCH] Mejoras de estabilidad de stream IPTV y nuevo registro de fallos MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - restream.py: eliminar -reconnect_streamed de ffmpeg para evitar rebobinados al reconectar (el proveedor re-enviaba desde keyframe anterior causando PTS backward). El loop de Python gestiona las reconexiones con conexión fresca. - restream.py: eliminar _drain_queue del loop de reconexión para que el buffer de la cola cubra el tiempo de reconexión sin pantalla negra en el player. - restream.py: añadir buffer_server_bytes/secs/capacity a stats() y método _log_stream_event() para persistir eventos de caída y recuperación en BD. - models/stream_event.py: nuevo modelo StreamEvent para registro de fallos. - database.py: registrar StreamEvent en init_db. - api/admin/logs.py: nuevos endpoints GET/DELETE /logs/events. - Dashboard.tsx: mostrar reserva de buffer del servidor (capacidad + estado). - Logs.tsx: añadir pestaña "Fallos de stream" con tabla de eventos persistidos. Co-Authored-By: Claude Sonnet 4.6 --- .gitignore | 45 + backend/__init__.py | 0 backend/api/__init__.py | 0 backend/api/admin/__init__.py | 0 backend/api/admin/catalogs.py | 90 + backend/api/admin/custom_categories.py | 186 ++ backend/api/admin/epg_admin.py | 60 + backend/api/admin/jellyfin_admin.py | 406 +++ backend/api/admin/logs.py | 195 ++ backend/api/admin/monitoring.py | 132 + backend/api/admin/providers.py | 833 ++++++ backend/api/admin/settings.py | 38 + backend/api/admin/users.py | 267 ++ backend/api/auth.py | 47 + backend/api/xtream.py | 928 ++++++ backend/config.py | 34 + backend/core/__init__.py | 0 backend/core/catalog.py | 78 + backend/core/epg_manager.py | 99 + backend/core/health_checker.py | 115 + backend/core/jellyfin_client.py | 120 + backend/core/pool.py | 314 ++ backend/core/probe.py | 112 + backend/core/restream.py | 610 ++++ backend/core/vod_tracker.py | 164 + backend/core/xtream_client.py | 87 + backend/database.py | 42 + backend/main.py | 143 + backend/models/__init__.py | 15 + backend/models/channel.py | 61 + backend/models/custom_category.py | 29 + backend/models/epg.py | 13 + backend/models/jellyfin.py | 47 + backend/models/log.py | 19 + backend/models/notification.py | 16 + backend/models/provider.py | 41 + backend/models/stream_event.py | 16 + backend/models/user.py | 66 + backend/static/assets/index-Bf2TNXpE.css | 1 + backend/static/assets/index-H1dlHjcY.js | 278 ++ backend/static/blocked_image.jpg | Bin 0 -> 2459546 bytes backend/static/index.html | 14 + frontend/index.html | 13 + frontend/package-lock.json | 3465 ++++++++++++++++++++++ frontend/package.json | 30 + frontend/postcss.config.js | 6 + frontend/src/App.tsx | 41 + frontend/src/components/Layout.tsx | 238 ++ frontend/src/index.css | 12 + frontend/src/lib/api.ts | 30 + frontend/src/main.tsx | 10 + frontend/src/pages/Catalogs.tsx | 87 + frontend/src/pages/CustomCategories.tsx | 337 +++ frontend/src/pages/Dashboard.tsx | 517 ++++ frontend/src/pages/EPG.tsx | 118 + frontend/src/pages/Jellyfin.tsx | 480 +++ frontend/src/pages/Login.tsx | 74 + frontend/src/pages/Logs.tsx | 469 +++ frontend/src/pages/Providers.tsx | 896 ++++++ frontend/src/pages/Settings.tsx | 153 + frontend/src/pages/Users.tsx | 439 +++ frontend/tailwind.config.js | 24 + frontend/tsconfig.json | 17 + frontend/vite.config.ts | 16 + scripts/install.sh | 46 + 65 files changed, 13279 insertions(+) create mode 100644 .gitignore create mode 100644 backend/__init__.py create mode 100644 backend/api/__init__.py create mode 100644 backend/api/admin/__init__.py create mode 100644 backend/api/admin/catalogs.py create mode 100644 backend/api/admin/custom_categories.py create mode 100644 backend/api/admin/epg_admin.py create mode 100644 backend/api/admin/jellyfin_admin.py create mode 100644 backend/api/admin/logs.py create mode 100644 backend/api/admin/monitoring.py create mode 100644 backend/api/admin/providers.py create mode 100644 backend/api/admin/settings.py create mode 100644 backend/api/admin/users.py create mode 100644 backend/api/auth.py create mode 100644 backend/api/xtream.py create mode 100644 backend/config.py create mode 100644 backend/core/__init__.py create mode 100644 backend/core/catalog.py create mode 100644 backend/core/epg_manager.py create mode 100644 backend/core/health_checker.py create mode 100644 backend/core/jellyfin_client.py create mode 100644 backend/core/pool.py create mode 100644 backend/core/probe.py create mode 100644 backend/core/restream.py create mode 100644 backend/core/vod_tracker.py create mode 100644 backend/core/xtream_client.py create mode 100644 backend/database.py create mode 100644 backend/main.py create mode 100644 backend/models/__init__.py create mode 100644 backend/models/channel.py create mode 100644 backend/models/custom_category.py create mode 100644 backend/models/epg.py create mode 100644 backend/models/jellyfin.py create mode 100644 backend/models/log.py create mode 100644 backend/models/notification.py create mode 100644 backend/models/provider.py create mode 100644 backend/models/stream_event.py create mode 100644 backend/models/user.py create mode 100644 backend/static/assets/index-Bf2TNXpE.css create mode 100644 backend/static/assets/index-H1dlHjcY.js create mode 100644 backend/static/blocked_image.jpg create mode 100644 backend/static/index.html create mode 100644 frontend/index.html create mode 100644 frontend/package-lock.json create mode 100644 frontend/package.json create mode 100644 frontend/postcss.config.js create mode 100644 frontend/src/App.tsx create mode 100644 frontend/src/components/Layout.tsx create mode 100644 frontend/src/index.css create mode 100644 frontend/src/lib/api.ts create mode 100644 frontend/src/main.tsx create mode 100644 frontend/src/pages/Catalogs.tsx create mode 100644 frontend/src/pages/CustomCategories.tsx create mode 100644 frontend/src/pages/Dashboard.tsx create mode 100644 frontend/src/pages/EPG.tsx create mode 100644 frontend/src/pages/Jellyfin.tsx create mode 100644 frontend/src/pages/Login.tsx create mode 100644 frontend/src/pages/Logs.tsx create mode 100644 frontend/src/pages/Providers.tsx create mode 100644 frontend/src/pages/Settings.tsx create mode 100644 frontend/src/pages/Users.tsx create mode 100644 frontend/tailwind.config.js create mode 100644 frontend/tsconfig.json create mode 100644 frontend/vite.config.ts create mode 100755 scripts/install.sh diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..dc4f4b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,45 @@ +# Python +venv/ +__pycache__/ +*.py[cod] +*.pyo +*.pyd +.Python +*.egg-info/ +dist/ +build/ + +# Environment & secrets +.env +*.env +.env.* + +# Logs & runtime +logs/ +*.log +backend.pid +dump.rdb + +# Frontend build artifacts (built files are in backend/static, kept) +frontend/node_modules/ +frontend/dist/ +frontend/.vite/ +frontend/tsconfig.tsbuildinfo + +# Database files +*.db +*.sqlite3 + +# OS +.DS_Store +Thumbs.db + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*.bak + +# Nginx runtime +nginx/logs/ diff --git a/backend/__init__.py b/backend/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/__init__.py b/backend/api/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/admin/__init__.py b/backend/api/admin/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/api/admin/catalogs.py b/backend/api/admin/catalogs.py new file mode 100644 index 0000000..f8972a1 --- /dev/null +++ b/backend/api/admin/catalogs.py @@ -0,0 +1,90 @@ +"""Admin API: category/catalog management.""" +from fastapi import APIRouter, Depends +from sqlalchemy import select, func +from sqlalchemy.ext.asyncio import AsyncSession +from pydantic import BaseModel + +from ...database import get_db +from ...models.channel import Category, Channel, ChannelProviderMap, ContentType +from ..auth import get_current_admin + +router = APIRouter(prefix="/catalogs", tags=["catalogs"]) + + +class CategoryOut(BaseModel): + id: int + name: str + type: ContentType + provider_category_id: str | None + provider_account_id: int | None + + class Config: + from_attributes = True + + +class GroupedCategoryOut(BaseModel): + name: str + type: ContentType + category_ids: list[int] + provider_count: int # distinct providers that can serve channels in this category + + +@router.get("/", response_model=list[CategoryOut]) +async def list_categories( + content_type: ContentType | None = None, + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + q = select(Category).order_by(Category.type, Category.name) + if content_type: + q = q.where(Category.type == content_type) + result = await db.execute(q) + return result.scalars().all() + + +@router.get("/grouped", response_model=list[GroupedCategoryOut]) +async def list_categories_grouped( + content_type: ContentType | None = None, + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + """Returns categories merged by name+type. Includes how many providers can serve each.""" + q = select(Category).order_by(Category.type, Category.name) + if content_type: + q = q.where(Category.type == content_type) + cats_result = await db.execute(q) + all_cats = cats_result.scalars().all() + + # Group by (name_normalized, type) + seen: dict[tuple[str, str], dict] = {} + for cat in all_cats: + key = (cat.name.strip().lower(), str(cat.type)) + if key not in seen: + seen[key] = {"name": cat.name, "type": cat.type, "category_ids": [], "provider_count": 0} + seen[key]["category_ids"].append(cat.id) + + if not seen: + return [] + + # Map each category_id back to its group key for the count query + cat_id_to_key: dict[int, tuple[str, str]] = {} + for key, group in seen.items(): + for cat_id in group["category_ids"]: + cat_id_to_key[cat_id] = key + + # Single query: distinct providers per category_id — avoids locale-dependent lower() issues + pcount_q = await db.execute( + select( + Channel.category_id, + func.count(func.distinct(ChannelProviderMap.provider_account_id)).label("pcount"), + ) + .join(ChannelProviderMap, ChannelProviderMap.channel_id == Channel.id) + .where(Channel.category_id.in_(list(cat_id_to_key.keys()))) + .group_by(Channel.category_id) + ) + for row in pcount_q: + key = cat_id_to_key.get(row.category_id) + if key and key in seen: + seen[key]["provider_count"] = max(seen[key]["provider_count"], row.pcount) + + return list(seen.values()) diff --git a/backend/api/admin/custom_categories.py b/backend/api/admin/custom_categories.py new file mode 100644 index 0000000..002e7ba --- /dev/null +++ b/backend/api/admin/custom_categories.py @@ -0,0 +1,186 @@ +"""CRUD for custom categories and their channel assignments.""" +from fastapi import APIRouter, Depends, HTTPException +from pydantic import BaseModel +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from ...database import get_db +from ...models.channel import Channel, ContentType +from ...models.custom_category import CustomCategory, CustomCategoryItem +from ..auth import get_current_admin + +router = APIRouter(prefix="/custom-categories", tags=["custom-categories"]) + + +class CategoryCreate(BaseModel): + name: str + type: str # live, movie, series + + +class CategoryUpdate(BaseModel): + name: str | None = None + is_visible: bool | None = None + position: int | None = None + + +class AddChannelRequest(BaseModel): + channel_id: int + + +# --------------------------------------------------------------------------- +# Category CRUD +# --------------------------------------------------------------------------- + +@router.get("") +async def list_categories(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(CustomCategory) + .options(selectinload(CustomCategory.items)) + .order_by(CustomCategory.position, CustomCategory.id) + ) + cats = result.scalars().all() + return [ + { + "id": c.id, + "name": c.name, + "type": c.type.value, + "position": c.position, + "is_visible": c.is_visible, + "item_count": len(c.items), + "created_at": c.created_at.isoformat() if c.created_at else None, + } + for c in cats + ] + + +@router.post("", status_code=201) +async def create_category(data: CategoryCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + try: + ctype = ContentType(data.type) + except ValueError: + raise HTTPException(400, "type must be one of: live, movie, series") + cat = CustomCategory(name=data.name.strip(), type=ctype) + db.add(cat) + await db.commit() + await db.refresh(cat) + return {"id": cat.id, "name": cat.name, "type": cat.type.value, "position": cat.position, "is_visible": cat.is_visible, "item_count": 0} + + +@router.patch("/{cat_id}") +async def update_category(cat_id: int, data: CategoryUpdate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(CustomCategory).where(CustomCategory.id == cat_id)) + cat = result.scalar_one_or_none() + if not cat: + raise HTTPException(404, "Not found") + if data.name is not None: + cat.name = data.name.strip() + if data.is_visible is not None: + cat.is_visible = data.is_visible + if data.position is not None: + cat.position = data.position + await db.commit() + return {"ok": True} + + +@router.delete("/{cat_id}", status_code=204) +async def delete_category(cat_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(CustomCategory).where(CustomCategory.id == cat_id)) + cat = result.scalar_one_or_none() + if not cat: + raise HTTPException(404, "Not found") + await db.delete(cat) + await db.commit() + + +# --------------------------------------------------------------------------- +# Channel assignments +# --------------------------------------------------------------------------- + +@router.get("/{cat_id}/channels") +async def list_category_channels(cat_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(CustomCategoryItem, Channel) + .join(Channel, Channel.id == CustomCategoryItem.channel_id) + .where(CustomCategoryItem.custom_category_id == cat_id) + .order_by(CustomCategoryItem.position, CustomCategoryItem.id) + ) + rows = result.all() + return [ + { + "item_id": row.CustomCategoryItem.id, + "channel_id": row.Channel.id, + "name": row.Channel.name, + "logo": row.Channel.tvg_logo or "", + "type": row.Channel.type.value, + } + for row in rows + ] + + +@router.post("/{cat_id}/channels", status_code=201) +async def add_channel(cat_id: int, data: AddChannelRequest, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + # Verify category exists + cat_result = await db.execute(select(CustomCategory).where(CustomCategory.id == cat_id)) + if not cat_result.scalar_one_or_none(): + raise HTTPException(404, "Category not found") + # Verify channel exists + ch_result = await db.execute(select(Channel).where(Channel.id == data.channel_id)) + if not ch_result.scalar_one_or_none(): + raise HTTPException(404, "Channel not found") + # Check duplicate + dup = await db.execute( + select(CustomCategoryItem).where( + CustomCategoryItem.custom_category_id == cat_id, + CustomCategoryItem.channel_id == data.channel_id, + ) + ) + if dup.scalar_one_or_none(): + raise HTTPException(409, "Channel already in category") + item = CustomCategoryItem(custom_category_id=cat_id, channel_id=data.channel_id) + db.add(item) + await db.commit() + return {"ok": True} + + +@router.delete("/{cat_id}/channels/{item_id}", status_code=204) +async def remove_channel(cat_id: int, item_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(CustomCategoryItem).where( + CustomCategoryItem.id == item_id, + CustomCategoryItem.custom_category_id == cat_id, + ) + ) + item = result.scalar_one_or_none() + if not item: + raise HTTPException(404, "Not found") + await db.delete(item) + await db.commit() + + +# --------------------------------------------------------------------------- +# Channel search (for the picker) +# --------------------------------------------------------------------------- + +@router.get("/channels/search") +async def search_channels( + q: str = "", + type: str = "", + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + query = select(Channel).where(Channel.is_active == True) # noqa: E712 + if type: + try: + query = query.where(Channel.type == ContentType(type)) + except ValueError: + pass + if q: + query = query.where(Channel.name.ilike(f"%{q}%")) + query = query.order_by(Channel.name).limit(60) + result = await db.execute(query) + channels = result.scalars().all() + return [ + {"id": ch.id, "name": ch.name, "logo": ch.tvg_logo or "", "type": ch.type.value} + for ch in channels + ] diff --git a/backend/api/admin/epg_admin.py b/backend/api/admin/epg_admin.py new file mode 100644 index 0000000..c26c729 --- /dev/null +++ b/backend/api/admin/epg_admin.py @@ -0,0 +1,60 @@ +"""Admin API: EPG source management.""" +from fastapi import APIRouter, Depends, HTTPException, BackgroundTasks +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from pydantic import BaseModel + +from ...database import get_db +from ...models.epg import EpgSource +from ...core.epg_manager import refresh_epg +from ..auth import get_current_admin + +router = APIRouter(prefix="/epg", tags=["epg"]) + + +class EpgSourceCreate(BaseModel): + name: str + url: str + + +class EpgSourceOut(BaseModel): + id: int + name: str + url: str + is_active: bool + last_fetched_at: str | None = None + + class Config: + from_attributes = True + + +@router.get("/", response_model=list[EpgSourceOut]) +async def list_epg_sources(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(EpgSource).order_by(EpgSource.id)) + return result.scalars().all() + + +@router.post("/", response_model=EpgSourceOut) +async def create_epg_source(data: EpgSourceCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + source = EpgSource(**data.model_dump()) + db.add(source) + await db.commit() + await db.refresh(source) + return source + + +@router.delete("/{source_id}") +async def delete_epg_source(source_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(EpgSource).where(EpgSource.id == source_id)) + source = result.scalar_one_or_none() + if not source: + raise HTTPException(404, "EPG source not found") + await db.delete(source) + await db.commit() + return {"ok": True} + + +@router.post("/refresh") +async def trigger_refresh(background_tasks: BackgroundTasks, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + background_tasks.add_task(refresh_epg, db) + return {"ok": True, "message": "EPG refresh started in background"} diff --git a/backend/api/admin/jellyfin_admin.py b/backend/api/admin/jellyfin_admin.py new file mode 100644 index 0000000..f3baa93 --- /dev/null +++ b/backend/api/admin/jellyfin_admin.py @@ -0,0 +1,406 @@ +"""Admin API for Jellyfin integration — CRUD, library discovery, sync.""" +import asyncio +import logging +from datetime import datetime, timezone +from typing import Any + +from fastapi import APIRouter, Depends, HTTPException +from pydantic import BaseModel +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from ...core.jellyfin_client import JellyfinClient +from ...database import get_db, AsyncSessionLocal +from ...models.channel import Channel, Category, ChannelProviderMap, ContentType +from ...models.jellyfin import JellyfinConfig, JellyfinItem +from ...models.provider import ProviderAccount +from ..auth import get_current_admin + +router = APIRouter(prefix="/jellyfin", tags=["jellyfin"]) +logger = logging.getLogger(__name__) + +# sync_id → {"status": "running"|"done"|"error", "message": str, "synced": int} +_sync_status: dict[int, dict] = {} + + +# --------------------------------------------------------------------------- +# Schemas +# --------------------------------------------------------------------------- + +class JellyfinConfigCreate(BaseModel): + name: str + url: str + api_key: str + movies_category_name: str = "Películas KiraTV" + series_category_name: str = "Series KiraTV" + movies_library_id: str | None = None + series_library_id: str | None = None + + +class JellyfinConfigUpdate(BaseModel): + name: str | None = None + url: str | None = None + api_key: str | None = None + movies_category_name: str | None = None + series_category_name: str | None = None + movies_library_id: str | None = None + series_library_id: str | None = None + is_active: bool | None = None + + +# --------------------------------------------------------------------------- +# CRUD +# --------------------------------------------------------------------------- + +@router.get("", dependencies=[Depends(get_current_admin)]) +async def list_configs(db: AsyncSession = Depends(get_db)): + result = await db.execute( + select(JellyfinConfig).options(selectinload(JellyfinConfig.items)) + .order_by(JellyfinConfig.id) + ) + configs = result.scalars().all() + return [_config_dict(c) for c in configs] + + +@router.post("", dependencies=[Depends(get_current_admin)]) +async def create_config(body: JellyfinConfigCreate, db: AsyncSession = Depends(get_db)): + cfg = JellyfinConfig( + name=body.name, + url=body.url.rstrip("/"), + api_key=body.api_key, + movies_category_name=body.movies_category_name, + series_category_name=body.series_category_name, + movies_library_id=body.movies_library_id, + series_library_id=body.series_library_id, + ) + db.add(cfg) + await db.commit() + await db.refresh(cfg) + return _config_dict(cfg) + + +@router.put("/{cfg_id}", dependencies=[Depends(get_current_admin)]) +async def update_config(cfg_id: int, body: JellyfinConfigUpdate, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise HTTPException(404, "Not found") + if body.name is not None: + cfg.name = body.name + if body.url is not None: + cfg.url = body.url.rstrip("/") + if body.api_key is not None: + cfg.api_key = body.api_key + if body.movies_category_name is not None: + cfg.movies_category_name = body.movies_category_name + if body.series_category_name is not None: + cfg.series_category_name = body.series_category_name + if body.movies_library_id is not None: + cfg.movies_library_id = body.movies_library_id + if body.series_library_id is not None: + cfg.series_library_id = body.series_library_id + if body.is_active is not None: + cfg.is_active = body.is_active + await db.commit() + await db.refresh(cfg) + return _config_dict(cfg) + + +@router.delete("/{cfg_id}", dependencies=[Depends(get_current_admin)]) +async def delete_config(cfg_id: int, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise HTTPException(404, "Not found") + await db.delete(cfg) + await db.commit() + return {"ok": True} + + +# --------------------------------------------------------------------------- +# Test connection + library list +# --------------------------------------------------------------------------- + +@router.post("/{cfg_id}/test", dependencies=[Depends(get_current_admin)]) +async def test_connection(cfg_id: int, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise HTTPException(404, "Not found") + client = JellyfinClient(cfg.url, cfg.api_key) + try: + info = await client.test_connection() + return {"ok": True, "server_name": info.get("ServerName", ""), "version": info.get("Version", "")} + except Exception as e: + return {"ok": False, "error": str(e)} + + +@router.get("/{cfg_id}/libraries", dependencies=[Depends(get_current_admin)]) +async def get_libraries(cfg_id: int, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise HTTPException(404, "Not found") + client = JellyfinClient(cfg.url, cfg.api_key) + try: + libs = await client.get_libraries() + return [ + { + "id": lib.get("ItemId", ""), + "name": lib.get("Name", ""), + "type": lib.get("CollectionType", ""), + } + for lib in libs + ] + except Exception as e: + raise HTTPException(502, f"Jellyfin unreachable: {e}") + + +# --------------------------------------------------------------------------- +# Sync +# --------------------------------------------------------------------------- + +@router.post("/{cfg_id}/sync", dependencies=[Depends(get_current_admin)]) +async def start_sync(cfg_id: int, db: AsyncSession = Depends(get_db)): + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise HTTPException(404, "Not found") + if _sync_status.get(cfg_id, {}).get("status") == "running": + return {"status": "already_running"} + _sync_status[cfg_id] = {"status": "running", "message": "Iniciando…", "synced": 0} + asyncio.create_task(_do_sync(cfg_id)) + return {"status": "started"} + + +@router.get("/{cfg_id}/sync-status", dependencies=[Depends(get_current_admin)]) +async def sync_status(cfg_id: int): + return _sync_status.get(cfg_id, {"status": "idle", "message": "", "synced": 0}) + + +# --------------------------------------------------------------------------- +# Internal sync implementation +# --------------------------------------------------------------------------- + +async def _do_sync(cfg_id: int) -> None: + try: + async with AsyncSessionLocal() as db: + await _sync_jellyfin(cfg_id, db) + _sync_status[cfg_id] = {"status": "done", "message": "Sincronización completada", "synced": _sync_status[cfg_id].get("synced", 0)} + except Exception as e: + logger.error(f"Jellyfin sync error for config {cfg_id}: {e}", exc_info=True) + _sync_status[cfg_id] = {"status": "error", "message": str(e), "synced": 0} + + +async def _sync_jellyfin(cfg_id: int, db: AsyncSession) -> None: + result = await db.execute(select(JellyfinConfig).where(JellyfinConfig.id == cfg_id)) + cfg = result.scalar_one_or_none() + if not cfg: + raise ValueError(f"JellyfinConfig {cfg_id} not found") + + client = JellyfinClient(cfg.url, cfg.api_key) + _sync_status[cfg_id]["message"] = "Conectando a Jellyfin…" + + # 1. Ensure dummy ProviderAccount exists + provider = await _get_or_create_provider(cfg, db) + if cfg.provider_account_id != provider.id: + cfg.provider_account_id = provider.id + await db.flush() + + total_synced = 0 + + # 2. Sync movies + if cfg.movies_library_id: + _sync_status[cfg_id]["message"] = "Obteniendo películas…" + movies = await client.get_items(cfg.movies_library_id, "Movie") + _sync_status[cfg_id]["message"] = f"Sincronizando {len(movies)} películas…" + movie_cat = await _get_or_create_category( + db, cfg.movies_category_name, ContentType.movie, provider.id, "jellyfin_movies" + ) + for item in movies: + await _upsert_channel(db, cfg, provider, movie_cat, item, ContentType.movie, client) + total_synced += 1 + _sync_status[cfg_id]["synced"] = total_synced + + # 3. Sync series + if cfg.series_library_id: + _sync_status[cfg_id]["message"] = "Obteniendo series…" + series_list = await client.get_items(cfg.series_library_id, "Series") + _sync_status[cfg_id]["message"] = f"Sincronizando {len(series_list)} series…" + series_cat = await _get_or_create_category( + db, cfg.series_category_name, ContentType.series, provider.id, "jellyfin_series" + ) + for item in series_list: + await _upsert_channel(db, cfg, provider, series_cat, item, ContentType.series, client) + total_synced += 1 + _sync_status[cfg_id]["synced"] = total_synced + + cfg.last_sync_at = datetime.now(timezone.utc) + await db.commit() + logger.info(f"Jellyfin sync complete for config {cfg_id}: {total_synced} items") + + +async def _get_or_create_provider(cfg: JellyfinConfig, db: AsyncSession) -> ProviderAccount: + if cfg.provider_account_id: + result = await db.execute( + select(ProviderAccount).where(ProviderAccount.id == cfg.provider_account_id) + ) + existing = result.scalar_one_or_none() + if existing: + return existing + + provider = ProviderAccount( + name=f"[Jellyfin] {cfg.name}", + base_url=cfg.url, + username="jellyfin", + password=cfg.api_key, + max_connections=999, + is_active=True, + ) + db.add(provider) + await db.flush() + return provider + + +async def _get_or_create_category( + db: AsyncSession, + name: str, + ctype: ContentType, + provider_id: int, + provider_cat_id: str, +) -> Category: + result = await db.execute( + select(Category).where( + Category.provider_category_id == provider_cat_id, + Category.provider_account_id == provider_id, + Category.type == ctype, + ) + ) + cat = result.scalar_one_or_none() + if cat: + cat.name = name + return cat + cat = Category( + name=name, + type=ctype, + provider_category_id=provider_cat_id, + provider_account_id=provider_id, + ) + db.add(cat) + await db.flush() + return cat + + +async def _upsert_channel( + db: AsyncSession, + cfg: JellyfinConfig, + provider: ProviderAccount, + category: Category, + item: dict, + ctype: ContentType, + client: JellyfinClient, +) -> None: + jellyfin_id = item.get("Id", "") + if not jellyfin_id: + return + + stream_id = f"jf_{jellyfin_id}" + stream_url = client.build_stream_url(jellyfin_id) + image_url = client.build_image_url(jellyfin_id) + name = item.get("Name", "") + plot = item.get("Overview") or "" + year = item.get("ProductionYear") + genres = ", ".join(item.get("Genres", [])) + rating = item.get("OfficialRating") or "" + + # Find or create Channel + ch_result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == stream_id, Channel.type == ctype) + ) + ch = ch_result.scalar_one_or_none() + if not ch: + ch = Channel( + name=name, + stream_id_at_provider=stream_id, + type=ctype, + category_id=category.id, + tvg_logo=image_url, + is_active=True, + ) + db.add(ch) + await db.flush() + else: + ch.name = name + ch.tvg_logo = image_url + ch.category_id = category.id + ch.is_active = True + + # ChannelProviderMap + pmap_result = await db.execute( + select(ChannelProviderMap).where( + ChannelProviderMap.channel_id == ch.id, + ChannelProviderMap.provider_account_id == provider.id, + ) + ) + pmap = pmap_result.scalar_one_or_none() + if not pmap: + pmap = ChannelProviderMap( + channel_id=ch.id, + provider_account_id=provider.id, + stream_url=stream_url, + ) + db.add(pmap) + else: + pmap.stream_url = stream_url + + # JellyfinItem + ji_result = await db.execute( + select(JellyfinItem).where( + JellyfinItem.jellyfin_config_id == cfg.id, + JellyfinItem.jellyfin_item_id == jellyfin_id, + ) + ) + ji = ji_result.scalar_one_or_none() + if not ji: + ji = JellyfinItem( + jellyfin_config_id=cfg.id, + channel_id=ch.id, + jellyfin_item_id=jellyfin_id, + item_type=ctype.value, + plot=plot, + year=year, + genres=genres, + rating=rating, + ) + db.add(ji) + else: + ji.channel_id = ch.id + ji.plot = plot + ji.year = year + ji.genres = genres + ji.rating = rating + + await db.flush() + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + +def _config_dict(cfg: JellyfinConfig) -> dict: + return { + "id": cfg.id, + "name": cfg.name, + "url": cfg.url, + "api_key": cfg.api_key, + "is_active": cfg.is_active, + "movies_library_id": cfg.movies_library_id, + "series_library_id": cfg.series_library_id, + "movies_category_name": cfg.movies_category_name, + "series_category_name": cfg.series_category_name, + "last_sync_at": cfg.last_sync_at.isoformat() if cfg.last_sync_at else None, + "item_count": len(cfg.__dict__.get("items", [])), + } diff --git a/backend/api/admin/logs.py b/backend/api/admin/logs.py new file mode 100644 index 0000000..d8a648a --- /dev/null +++ b/backend/api/admin/logs.py @@ -0,0 +1,195 @@ +"""Connection log API — query and stats.""" +from datetime import datetime + +from fastapi import APIRouter, Depends, Query +from sqlalchemy import select, func, desc, distinct +from sqlalchemy.ext.asyncio import AsyncSession + +from ...database import get_db +from ...models.log import ConnectionLog +from ...models.stream_event import StreamEvent +from ..auth import get_current_admin + +router = APIRouter(prefix="/logs", tags=["logs"]) + + +@router.get("") +async def get_logs( + username: str | None = Query(None), + channel: str | None = Query(None), + content_type: str | None = Query(None), + date_from: str | None = Query(None), + date_to: str | None = Query(None), + page: int = Query(1, ge=1), + limit: int = Query(50, ge=1, le=200), + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + q = select(ConnectionLog).order_by(desc(ConnectionLog.started_at)) + + if username: + q = q.where(ConnectionLog.username.ilike(f"%{username}%")) + if channel: + q = q.where(ConnectionLog.channel_name.ilike(f"%{channel}%")) + if content_type: + q = q.where(ConnectionLog.content_type == content_type) + if date_from: + try: + q = q.where(ConnectionLog.started_at >= datetime.fromisoformat(date_from)) + except ValueError: + pass + if date_to: + try: + q = q.where(ConnectionLog.started_at <= datetime.fromisoformat(date_to)) + except ValueError: + pass + + total_result = await db.execute(select(func.count()).select_from(q.subquery())) + total = total_result.scalar() or 0 + + q = q.offset((page - 1) * limit).limit(limit) + result = await db.execute(q) + logs = result.scalars().all() + + return { + "total": total, + "page": page, + "limit": limit, + "items": [_serialize(log) for log in logs], + } + + +@router.get("/stats") +async def get_stats(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + top_users_q = await db.execute( + select( + ConnectionLog.username, + func.count().label("sessions"), + func.sum(ConnectionLog.bytes_transferred).label("bytes"), + ) + .group_by(ConnectionLog.username) + .order_by(desc("sessions")) + .limit(10) + ) + + top_channels_q = await db.execute( + select(ConnectionLog.channel_name, func.count().label("sessions")) + .where(ConnectionLog.channel_name.isnot(None)) + .group_by(ConnectionLog.channel_name) + .order_by(desc("sessions")) + .limit(10) + ) + + totals_q = await db.execute( + select( + func.count().label("total_sessions"), + func.sum(ConnectionLog.bytes_transferred).label("total_bytes"), + func.avg(ConnectionLog.duration_seconds).label("avg_duration"), + func.count(distinct(ConnectionLog.username)).label("unique_users"), + ) + ) + t = totals_q.one() + + return { + "total_sessions": t.total_sessions or 0, + "total_bytes": t.total_bytes or 0, + "avg_duration_seconds": round(t.avg_duration or 0), + "unique_users": t.unique_users or 0, + "top_users": [ + {"username": r.username, "sessions": r.sessions, "bytes": r.bytes or 0} + for r in top_users_q + ], + "top_channels": [ + {"channel_name": r.channel_name, "sessions": r.sessions} + for r in top_channels_q + ], + } + + +@router.delete("", status_code=204) +async def clear_logs(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Delete all logs (admin use).""" + from sqlalchemy import delete + await db.execute(delete(ConnectionLog)) + await db.commit() + + +@router.get("/events") +async def get_events( + channel: str | None = Query(None), + event_type: str | None = Query(None), + date_from: str | None = Query(None), + date_to: str | None = Query(None), + page: int = Query(1, ge=1), + limit: int = Query(50, ge=1, le=200), + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + q = select(StreamEvent).order_by(desc(StreamEvent.created_at)) + + if channel: + q = q.where(StreamEvent.channel_name.ilike(f"%{channel}%")) + if event_type: + q = q.where(StreamEvent.event_type == event_type) + if date_from: + try: + q = q.where(StreamEvent.created_at >= datetime.fromisoformat(date_from)) + except ValueError: + pass + if date_to: + try: + q = q.where(StreamEvent.created_at <= datetime.fromisoformat(date_to)) + except ValueError: + pass + + total_result = await db.execute(select(func.count()).select_from(q.subquery())) + total = total_result.scalar() or 0 + + q = q.offset((page - 1) * limit).limit(limit) + result = await db.execute(q) + events = result.scalars().all() + + return { + "total": total, + "page": page, + "limit": limit, + "items": [_serialize_event(ev) for ev in events], + } + + +@router.delete("/events", status_code=204) +async def clear_events(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + from sqlalchemy import delete + await db.execute(delete(StreamEvent)) + await db.commit() + + +def _serialize_event(ev: StreamEvent) -> dict: + return { + "id": ev.id, + "channel_id": ev.channel_id, + "channel_name": ev.channel_name, + "provider_name": ev.provider_name, + "event_type": ev.event_type, + "domain": ev.domain, + "error_message": ev.error_message, + "attempt_number": ev.attempt_number, + "created_at": ev.created_at.isoformat() if ev.created_at else None, + } + + +def _serialize(log: ConnectionLog) -> dict: + return { + "id": log.id, + "user_id": log.user_id, + "username": log.username, + "channel_id": log.channel_id, + "channel_name": log.channel_name, + "content_type": log.content_type, + "stream_id": log.stream_id, + "started_at": log.started_at.isoformat() if log.started_at else None, + "ended_at": log.ended_at.isoformat() if log.ended_at else None, + "duration_seconds": log.duration_seconds, + "bytes_transferred": log.bytes_transferred, + "client_ip": log.client_ip, + } diff --git a/backend/api/admin/monitoring.py b/backend/api/admin/monitoring.py new file mode 100644 index 0000000..1aab94c --- /dev/null +++ b/backend/api/admin/monitoring.py @@ -0,0 +1,132 @@ +"""Admin API: real-time stream monitoring via REST and WebSocket.""" +import asyncio +import json +import logging + +import redis.asyncio as aioredis +from fastapi import APIRouter, Depends, HTTPException, WebSocket, WebSocketDisconnect +from pydantic import BaseModel +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession + +from ...config import settings +from ...core.pool import pool, MONITORING_KEY +from ...core.vod_tracker import vod_tracker +from ...database import get_db +from ...models.jellyfin import JellyfinConfig +from ...models.provider import ProviderAccount +from ..auth import get_current_admin + +logger = logging.getLogger(__name__) +router = APIRouter(prefix="/monitoring", tags=["monitoring"]) + + +def _all_streams() -> list[dict]: + """Combined live + VOD/series sessions.""" + return pool.get_active_streams() + vod_tracker.get_all() + + +@router.get("/streams") +async def get_active_streams(_=Depends(get_current_admin)): + return _all_streams() + + +@router.get("/slots") +async def get_provider_slots(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + # Exclude Jellyfin dummy providers — they are local, have no slot limits + jf_subq = ( + select(JellyfinConfig.provider_account_id) + .where(JellyfinConfig.provider_account_id.isnot(None)) + .scalar_subquery() + ) + result = await db.execute( + select(ProviderAccount).where( + ProviderAccount.is_active == True, # noqa: E712 + ProviderAccount.id.notin_(jf_subq), + ) + ) + accounts = result.scalars().all() + + active_streams = _all_streams() + busy_accounts = {s["provider_account_id"] for s in active_streams} + + return [ + { + "id": acc.id, + "name": acc.name, + "max_connections": acc.max_connections, + "status": "busy" if acc.id in busy_accounts else "free", + "channel_id": next( + (s["channel_id"] for s in active_streams if s["provider_account_id"] == acc.id), None + ), + } + for acc in accounts + ] + + +class KillRequest(BaseModel): + client_id: str + + +@router.post("/kill") +async def kill_connection(body: KillRequest, _=Depends(get_current_admin)): + """Force-disconnect a client. Works for both live streams and VOD/series sessions.""" + cid = body.client_id + if cid.startswith("vod-"): + killed = vod_tracker.kill(cid) + else: + killed = await pool.kill_client(cid) + if not killed: + raise HTTPException(404, f"Client '{cid}' not found in any active stream") + return {"ok": True, "client_id": cid} + + +@router.websocket("/ws") +async def monitoring_websocket(websocket: WebSocket): + await websocket.accept() + redis_client = aioredis.from_url(settings.redis_url, decode_responses=True) + pubsub = redis_client.pubsub() + + try: + await pubsub.subscribe(MONITORING_KEY) + + # Send initial combined state + await websocket.send_text(json.dumps({"type": "state", "data": _all_streams()})) + + async def redis_reader(): + """Forward live-stream pool events from Redis pub/sub.""" + async for message in pubsub.listen(): + if message["type"] == "message": + try: + # Pool publishes only live streams; merge with VOD here + await websocket.send_text(json.dumps({"type": "update", "data": _all_streams()})) + except Exception: + return + + async def broadcaster(): + """Push full state every 2 s for VOD bytes/bps updates.""" + while True: + await asyncio.sleep(2) + try: + await websocket.send_text(json.dumps({"type": "update", "data": _all_streams()})) + except Exception: + return + + reader_task = asyncio.create_task(redis_reader()) + broadcaster_task = asyncio.create_task(broadcaster()) + + try: + await asyncio.gather(reader_task, broadcaster_task) + except WebSocketDisconnect: + pass + finally: + reader_task.cancel() + broadcaster_task.cancel() + + except WebSocketDisconnect: + pass + except Exception as e: + logger.error(f"Monitoring WS error: {e}") + finally: + await pubsub.unsubscribe(MONITORING_KEY) + await redis_client.aclose() diff --git a/backend/api/admin/providers.py b/backend/api/admin/providers.py new file mode 100644 index 0000000..f4a1128 --- /dev/null +++ b/backend/api/admin/providers.py @@ -0,0 +1,833 @@ +"""Admin API: provider account management + sync.""" +import asyncio +import json +import logging +from datetime import datetime, timezone +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy import select, delete +from sqlalchemy.ext.asyncio import AsyncSession +from pydantic import BaseModel + +from sqlalchemy.orm import selectinload +from ...database import get_db, AsyncSessionLocal +from ...models.provider import ProviderAccount, ProviderUrl +from ...models.channel import Category, Channel, ChannelProviderMap, ContentType +from ...models.notification import NotificationDismissal +from ...models.epg import EpgSource +from ...core.xtream_client import XtreamClient +from ...core.epg_manager import refresh_epg +from ..auth import get_current_admin + +logger = logging.getLogger(__name__) +router = APIRouter(prefix="/providers", tags=["providers"]) + +# Track ongoing sync tasks: provider_id -> status dict +_sync_status: dict[int, dict] = {} + + +class ProviderCreate(BaseModel): + name: str + base_url: str + username: str + password: str + max_connections: int = 1 + auto_sync_hours: int = 0 # 0=disabled, 6/12/24=interval in hours + + +class ProviderUpdate(BaseModel): + name: str + base_url: str + username: str + password: str | None = None # None = keep existing + max_connections: int = 1 + auto_sync_hours: int = 0 + + +class ProviderUrlOut(BaseModel): + id: int + url: str + priority: int + is_active: bool + status: str + response_ms: int | None = None + last_checked_at: datetime | None = None + + class Config: + from_attributes = True + + +class ProviderOut(BaseModel): + id: int + name: str + base_url: str + username: str + max_connections: int + is_active: bool + last_sync_at: datetime | None + expiry_date: datetime | None = None + auto_sync_hours: int + last_sync_categories: str | None # raw JSON, parsed on frontend + urls: list[ProviderUrlOut] = [] + + class Config: + from_attributes = True + + +class SyncRequest(BaseModel): + live_category_ids: list[str] | None = None # None = import all + movie_category_ids: list[str] | None = None + series_category_ids: list[str] | None = None + + +def _jellyfin_provider_subq(): + """Subquery returning provider_account_ids used by Jellyfin configs.""" + from ...models.jellyfin import JellyfinConfig + return ( + select(JellyfinConfig.provider_account_id) + .where(JellyfinConfig.provider_account_id.isnot(None)) + .scalar_subquery() + ) + + +@router.get("/", response_model=list[ProviderOut]) +async def list_providers(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(ProviderAccount) + .options(selectinload(ProviderAccount.extra_urls)) + .where(ProviderAccount.id.notin_(_jellyfin_provider_subq())) + .order_by(ProviderAccount.id) + ) + providers = result.scalars().all() + # Map extra_urls to the urls field expected by ProviderOut + for p in providers: + p.urls = p.extra_urls + return providers + + +async def _sync_epg_source(db: AsyncSession, provider: ProviderAccount) -> None: + """Create or update the auto-managed EPG source for a provider.""" + url = XtreamClient(provider.base_url, provider.username, provider.password).get_xmltv_url() + name = f"EPG - {provider.name}" + result = await db.execute(select(EpgSource).where(EpgSource.name == name)) + source = result.scalar_one_or_none() + if source: + source.url = url + else: + db.add(EpgSource(name=name, url=url, is_active=True)) + await db.commit() + + +async def _delete_epg_source(db: AsyncSession, provider: ProviderAccount) -> None: + name = f"EPG - {provider.name}" + result = await db.execute(select(EpgSource).where(EpgSource.name == name)) + source = result.scalar_one_or_none() + if source: + await db.delete(source) + await db.commit() + + +@router.post("/", response_model=ProviderOut) +async def create_provider(data: ProviderCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + provider = ProviderAccount(**data.model_dump()) + db.add(provider) + await db.commit() + await db.refresh(provider) + await _sync_epg_source(db, provider) + return provider + + +@router.put("/{provider_id}", response_model=ProviderOut) +async def update_provider(provider_id: int, data: ProviderUpdate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + provider.name = data.name + provider.base_url = data.base_url + provider.username = data.username + provider.max_connections = data.max_connections + provider.auto_sync_hours = data.auto_sync_hours + if data.password: + provider.password = data.password + await db.commit() + await db.refresh(provider) + await _sync_epg_source(db, provider) + return provider + + +@router.get("/{provider_id}/synced-category-ids") +async def get_synced_category_ids(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Returns the category IDs currently synced in DB for this provider (by content type).""" + result = await db.execute( + select(Category.provider_category_id, Category.type) + .where(Category.provider_account_id == provider_id) + ) + rows = result.all() + return { + "live": [r.provider_category_id for r in rows if r.type == ContentType.live], + "movie": [r.provider_category_id for r in rows if r.type == ContentType.movie], + "series": [r.provider_category_id for r in rows if r.type == ContentType.series], + } + + +@router.get("/{provider_id}/available-updates") +async def get_available_updates(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Return categories from the provider that are NOT yet synced into the DB.""" + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + + client = XtreamClient(provider.base_url, provider.username, provider.password) + live_task = asyncio.create_task(client.get_live_categories()) + vod_task = asyncio.create_task(client.get_vod_categories()) + series_task = asyncio.create_task(client.get_series_categories()) + live_raw, vod_raw, series_raw = await asyncio.gather(live_task, vod_task, series_task, return_exceptions=True) + + def to_list(raw): + if isinstance(raw, Exception): + return [] + return raw if isinstance(raw, list) else [] + + # Get all category provider_category_ids already in DB for this provider + db_cats = await db.execute( + select(Category.provider_category_id, Category.type) + .where(Category.provider_account_id == provider_id) + ) + synced: set[tuple] = {(str(r.provider_category_id), r.type) for r in db_cats} + + def filter_new(raw, ctype: ContentType): + result = [] + for c in to_list(raw): + cat_id = str(c.get("category_id", "")) + if not cat_id: + continue + if (cat_id, ctype) not in synced: + result.append({"id": cat_id, "name": c.get("category_name", ""), "type": ctype.value}) + return result + + new_live = filter_new(live_raw, ContentType.live) + new_movie = filter_new(vod_raw, ContentType.movie) + new_series = filter_new(series_raw, ContentType.series) + + return { + "provider_id": provider_id, + "provider_name": provider.name, + "new_categories": new_live + new_movie + new_series, + "total": len(new_live) + len(new_movie) + len(new_series), + } + + +@router.delete("/{provider_id}") +async def delete_provider(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + await _delete_epg_source(db, provider) + await db.delete(provider) + await db.commit() + return {"ok": True} + + +@router.get("/notifications/all") +async def get_all_notifications(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Return new (unsynced + undismissed) categories across all providers (Jellyfin excluded).""" + providers_result = await db.execute( + select(ProviderAccount).where( + ProviderAccount.is_active == True, # noqa: E712 + ProviderAccount.last_sync_at.isnot(None), + ProviderAccount.id.notin_(_jellyfin_provider_subq()), + ) + ) + providers = providers_result.scalars().all() + + # Load all dismissals + dismissals_result = await db.execute(select(NotificationDismissal)) + dismissed: set[tuple] = { + (str(d.provider_id), d.category_id_str, d.category_type) + for d in dismissals_result.scalars().all() + } + + notifications = [] + for provider in providers: + client = XtreamClient(provider.base_url, provider.username, provider.password) + try: + live_raw, vod_raw, series_raw = await asyncio.gather( + client.get_live_categories(), + client.get_vod_categories(), + client.get_series_categories(), + return_exceptions=True, + ) + except Exception: + continue + + db_cats = await db.execute( + select(Category.provider_category_id, Category.type) + .where(Category.provider_account_id == provider.id) + ) + synced: set[tuple] = {(str(r.provider_category_id), r.type) for r in db_cats} + + def collect_new(raw, ctype: ContentType): + if isinstance(raw, Exception): + return [] + items = [] + for c in (raw if isinstance(raw, list) else []): + cat_id = str(c.get("category_id", "")) + if not cat_id: + continue + if (cat_id, ctype) in synced: + continue + if (str(provider.id), cat_id, ctype.value) in dismissed: + continue + items.append({"id": cat_id, "name": c.get("category_name", ""), "type": ctype.value}) + return items + + new_cats = ( + collect_new(live_raw, ContentType.live) + + collect_new(vod_raw, ContentType.movie) + + collect_new(series_raw, ContentType.series) + ) + if new_cats: + notifications.append({ + "provider_id": provider.id, + "provider_name": provider.name, + "categories": new_cats, + }) + + total = sum(len(n["categories"]) for n in notifications) + return {"notifications": notifications, "total": total} + + +@router.get("/notifications/count") +async def get_notifications_count(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Fast count of undismissed new categories (checks DB only, no remote API calls).""" + providers_result = await db.execute( + select(ProviderAccount).where(ProviderAccount.is_active == True, ProviderAccount.last_sync_at.isnot(None)) # noqa: E712 + ) + providers = providers_result.scalars().all() + + dismissals_result = await db.execute(select(NotificationDismissal)) + dismissed: set[tuple] = { + (str(d.provider_id), d.category_id_str, d.category_type) + for d in dismissals_result.scalars().all() + } + + # Compare last_sync_categories to what's available + total = 0 + for provider in providers: + if not provider.last_sync_categories: + continue + try: + last = json.loads(provider.last_sync_categories) + except Exception: + continue + # We can't do a fast count without hitting remote — just return 0 here + # Real count comes from get_all_notifications + return {"total": total} + + +class DismissRequest(BaseModel): + provider_id: int + category_id: str + category_type: str + + +@router.post("/notifications/dismiss") +async def dismiss_notification(data: DismissRequest, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + existing = await db.execute( + select(NotificationDismissal).where( + NotificationDismissal.provider_id == data.provider_id, + NotificationDismissal.category_id_str == data.category_id, + NotificationDismissal.category_type == data.category_type, + ) + ) + if not existing.scalar_one_or_none(): + db.add(NotificationDismissal( + provider_id=data.provider_id, + category_id_str=data.category_id, + category_type=data.category_type, + )) + await db.commit() + return {"ok": True} + + +@router.post("/notifications/dismiss-provider/{provider_id}") +async def dismiss_all_for_provider(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Dismiss all pending notifications for a specific provider.""" + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + + client = XtreamClient(provider.base_url, provider.username, provider.password) + try: + live_raw, vod_raw, series_raw = await asyncio.gather( + client.get_live_categories(), + client.get_vod_categories(), + client.get_series_categories(), + return_exceptions=True, + ) + except Exception as e: + raise HTTPException(500, f"Failed to fetch provider categories: {e}") + + db_cats = await db.execute( + select(Category.provider_category_id, Category.type) + .where(Category.provider_account_id == provider_id) + ) + synced: set[tuple] = {(str(r.provider_category_id), r.type) for r in db_cats} + + dismissed_result = await db.execute( + select(NotificationDismissal.category_id_str, NotificationDismissal.category_type) + .where(NotificationDismissal.provider_id == provider_id) + ) + already_dismissed: set[tuple] = {(r[0], r[1]) for r in dismissed_result.all()} + + count = 0 + for raw, ctype in [(live_raw, ContentType.live), (vod_raw, ContentType.movie), (series_raw, ContentType.series)]: + if isinstance(raw, Exception): + continue + for c in (raw if isinstance(raw, list) else []): + cat_id = str(c.get("category_id", "")) + if not cat_id or (cat_id, ctype) in synced: + continue + if (cat_id, ctype.value) not in already_dismissed: + db.add(NotificationDismissal( + provider_id=provider_id, + category_id_str=cat_id, + category_type=ctype.value, + )) + count += 1 + + await db.commit() + return {"ok": True, "dismissed": count} + + +@router.get("/{provider_id}/epg-url") +async def get_provider_epg_url(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Returns the XMLTV EPG URL for this provider (auto-registered as EPG source).""" + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + url = XtreamClient(provider.base_url, provider.username, provider.password).get_xmltv_url() + return {"url": url} + + +@router.post("/{provider_id}/test") +async def test_provider(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + client = XtreamClient(provider.base_url, provider.username, provider.password) + ok = False + try: + info = await client.get_user_info() + user_info = info.get("user_info", {}) + ok = user_info.get("status") == "Active" + exp_ts = user_info.get("exp_date") + if exp_ts: + try: + provider.expiry_date = datetime.fromtimestamp(int(exp_ts), tz=timezone.utc) + await db.commit() + except (ValueError, TypeError): + pass + except Exception as e: + logger.warning(f"Provider test failed: {e}") + return {"connected": ok} + + +@router.get("/{provider_id}/sync/categories") +async def get_provider_categories(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + """Fetch available categories from provider without importing — used for the category picker.""" + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + + client = XtreamClient(provider.base_url, provider.username, provider.password) + + live_task = asyncio.create_task(client.get_live_categories()) + vod_task = asyncio.create_task(client.get_vod_categories()) + series_task = asyncio.create_task(client.get_series_categories()) + + live_raw, vod_raw, series_raw = await asyncio.gather(live_task, vod_task, series_task, return_exceptions=True) + + def to_list(raw): + if isinstance(raw, Exception): + logger.warning(f"Category fetch error: {raw}") + return [] + return [{"id": str(c.get("category_id", "")), "name": c.get("category_name", "")} for c in raw if c.get("category_id")] + + return { + "live": to_list(live_raw), + "movie": to_list(vod_raw), + "series": to_list(series_raw), + } + + +@router.get("/{provider_id}/sync/status") +async def sync_status(provider_id: int, _=Depends(get_current_admin)): + return _sync_status.get(provider_id, {"status": "idle"}) + + +@router.post("/{provider_id}/sync") +async def sync_provider( + provider_id: int, + body: SyncRequest = SyncRequest(), + db: AsyncSession = Depends(get_db), + _=Depends(get_current_admin), +): + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + + if _sync_status.get(provider_id, {}).get("status") == "running": + return {"ok": False, "message": "Sync already in progress", "status": _sync_status[provider_id]} + + _sync_status[provider_id] = {"status": "running", "progress": "Iniciando...", "stats": {}} + asyncio.create_task(_run_sync( + provider_id, + provider.base_url, + provider.username, + provider.password, + selected_live=set(body.live_category_ids) if body.live_category_ids is not None else None, + selected_movie=set(body.movie_category_ids) if body.movie_category_ids is not None else None, + selected_series=set(body.series_category_ids) if body.series_category_ids is not None else None, + )) + return {"ok": True, "message": "Sync started in background", "status_url": f"/api/admin/providers/{provider_id}/sync/status"} + + +async def _run_sync( + provider_id: int, + base_url: str, + username: str, + password: str, + selected_live: set[str] | None = None, + selected_movie: set[str] | None = None, + selected_series: set[str] | None = None, +) -> None: + """ + Efficient sync: fetches ALL streams in one call per type (not per category). + Total HTTP calls: 3 category lists + 3 stream lists = 6 calls regardless of provider size. + selected_* = None means import all; set means only import those category IDs. + """ + client = XtreamClient(base_url, username, password) + stats = { + "live_categories": 0, "live_channels": 0, + "vod_categories": 0, "vod_channels": 0, + "series_categories": 0, "series": 0, + } + + def update_progress(msg: str): + _sync_status[provider_id] = {"status": "running", "progress": msg, "stats": stats.copy()} + logger.info(f"[Sync #{provider_id}] {msg}") + + try: + async with AsyncSessionLocal() as db: + # ── LIVE ────────────────────────────────────────────────── + update_progress("Descargando categorías Live...") + try: + live_cats = await client.get_live_categories() + cat_map_live: dict[str, Category] = {} + for cat_data in live_cats: + cat_id_str = str(cat_data.get("category_id", "")) + if selected_live is not None and cat_id_str not in selected_live: + continue + cat = await _upsert_category(db, cat_data, ContentType.live, provider_id) + cat_map_live[cat_id_str] = cat + stats["live_categories"] += 1 + await db.flush() + + update_progress(f"Descargando canales Live ({stats['live_categories']} cats)...") + all_live = await client.get_live_streams() + for ch_data in all_live: + cat_id_str = str(ch_data.get("category_id", "")) + if cat_id_str not in cat_map_live: + continue # category not selected or not loaded + cat = cat_map_live.get(cat_id_str) + await _upsert_channel(db, ch_data, cat, ContentType.live, provider_id, client) + stats["live_channels"] += 1 + if stats["live_channels"] % 500 == 0: + update_progress(f"Live: {stats['live_channels']} canales procesados...") + await db.flush() + + await db.flush() + except Exception as e: + logger.error(f"[Sync #{provider_id}] Live error: {e}", exc_info=True) + + # ── VOD ─────────────────────────────────────────────────── + update_progress("Descargando categorías VOD...") + try: + vod_cats = await client.get_vod_categories() + cat_map_vod: dict[str, Category] = {} + for cat_data in vod_cats: + cat_id_str = str(cat_data.get("category_id", "")) + if selected_movie is not None and cat_id_str not in selected_movie: + continue + cat = await _upsert_category(db, cat_data, ContentType.movie, provider_id) + cat_map_vod[cat_id_str] = cat + stats["vod_categories"] += 1 + await db.flush() + + update_progress(f"Descargando películas VOD ({stats['vod_categories']} cats)...") + all_vod = await client.get_vod_streams() + for ch_data in all_vod: + cat_id_str = str(ch_data.get("category_id", "")) + if cat_id_str not in cat_map_vod: + continue + cat = cat_map_vod.get(cat_id_str) + await _upsert_channel(db, ch_data, cat, ContentType.movie, provider_id, client) + stats["vod_channels"] += 1 + if stats["vod_channels"] % 500 == 0: + update_progress(f"VOD: {stats['vod_channels']} canales procesados...") + await db.flush() + + await db.flush() + except Exception as e: + logger.error(f"[Sync #{provider_id}] VOD error: {e}", exc_info=True) + + # ── SERIES ──────────────────────────────────────────────── + update_progress("Descargando categorías Series...") + try: + series_cats = await client.get_series_categories() + cat_map_series: dict[str, Category] = {} + for cat_data in series_cats: + cat_id_str = str(cat_data.get("category_id", "")) + if selected_series is not None and cat_id_str not in selected_series: + continue + cat = await _upsert_category(db, cat_data, ContentType.series, provider_id) + cat_map_series[cat_id_str] = cat + stats["series_categories"] += 1 + await db.flush() + + update_progress(f"Descargando series ({stats['series_categories']} cats)...") + all_series = await client.get_series() + for s_data in all_series: + cat_id_str = str(s_data.get("category_id", "")) + if cat_id_str not in cat_map_series: + continue + cat = cat_map_series.get(cat_id_str) + await _upsert_channel(db, s_data, cat, ContentType.series, provider_id, client) + stats["series"] += 1 + if stats["series"] % 500 == 0: + update_progress(f"Series: {stats['series']} procesadas...") + await db.flush() + + await db.flush() + except Exception as e: + logger.error(f"[Sync #{provider_id}] Series error: {e}", exc_info=True) + + # ── FINAL COMMIT ────────────────────────────────────────── + update_progress("Guardando en base de datos...") + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if provider: + provider.last_sync_at = datetime.now(timezone.utc) + provider.last_sync_categories = json.dumps({ + "live": list(selected_live) if selected_live is not None else None, + "movie": list(selected_movie) if selected_movie is not None else None, + "series": list(selected_series) if selected_series is not None else None, + }) + await db.commit() + + _sync_status[provider_id] = {"status": "done", "progress": "Sync completado", "stats": stats} + logger.info(f"[Sync #{provider_id}] Completed: {stats}") + + # Auto-update EPG source and trigger background refresh + async with AsyncSessionLocal() as epg_db: + prov_result = await epg_db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + prov = prov_result.scalar_one_or_none() + if prov: + await _sync_epg_source(epg_db, prov) + await refresh_epg(epg_db) + + except Exception as e: + logger.error(f"[Sync #{provider_id}] Fatal error: {e}", exc_info=True) + _sync_status[provider_id] = {"status": "error", "progress": str(e), "stats": stats} + + +# ── Provider URL management ──────────────────────────────────────────── + +class ProviderUrlCreate(BaseModel): + url: str + priority: int = 10 + is_active: bool = True + + +@router.get("/{provider_id}/urls", response_model=list[ProviderUrlOut]) +async def list_provider_urls(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(ProviderUrl) + .where(ProviderUrl.provider_account_id == provider_id) + .order_by(ProviderUrl.priority) + ) + return result.scalars().all() + + +@router.post("/{provider_id}/urls", response_model=ProviderUrlOut) +async def add_provider_url(provider_id: int, data: ProviderUrlCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + pu = ProviderUrl(provider_account_id=provider_id, **data.model_dump()) + db.add(pu) + await db.commit() + await db.refresh(pu) + return pu + + +@router.put("/{provider_id}/urls/{url_id}", response_model=ProviderUrlOut) +async def update_provider_url(provider_id: int, url_id: int, data: ProviderUrlCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(ProviderUrl).where(ProviderUrl.id == url_id, ProviderUrl.provider_account_id == provider_id) + ) + pu = result.scalar_one_or_none() + if not pu: + raise HTTPException(404, "URL not found") + pu.url = data.url + pu.priority = data.priority + pu.is_active = data.is_active + await db.commit() + await db.refresh(pu) + return pu + + +@router.delete("/{provider_id}/urls/{url_id}") +async def delete_provider_url(provider_id: int, url_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(ProviderUrl).where(ProviderUrl.id == url_id, ProviderUrl.provider_account_id == provider_id) + ) + pu = result.scalar_one_or_none() + if not pu: + raise HTTPException(404, "URL not found") + await db.delete(pu) + await db.commit() + return {"ok": True} + + +@router.post("/{provider_id}/urls/check-all") +async def check_all_provider_urls(provider_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + from ...core.health_checker import check_provider_urls + result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = result.scalar_one_or_none() + if not provider: + raise HTTPException(404, "Provider not found") + results = await check_provider_urls(provider_id) + return results + + +async def _upsert_category(db: AsyncSession, cat_data: dict, ctype: ContentType, provider_id: int) -> Category: + provider_cat_id = str(cat_data.get("category_id", "")) + cat_name = cat_data.get("category_name", "Unknown") + + # First: check if a category with the same name+type already exists (any provider) + # This merges duplicate categories from multiple providers automatically + result = await db.execute( + select(Category).where( + Category.name == cat_name, + Category.type == ctype, + ) + ) + cat = result.scalar_one_or_none() + + if not cat: + # Check by provider+id (in case name changed) + result2 = await db.execute( + select(Category).where( + Category.provider_category_id == provider_cat_id, + Category.provider_account_id == provider_id, + Category.type == ctype, + ) + ) + cat = result2.scalar_one_or_none() + + if not cat: + cat = Category( + name=cat_name, + type=ctype, + provider_category_id=provider_cat_id, + provider_account_id=provider_id, + ) + db.add(cat) + await db.flush() + else: + cat.name = cat_name + return cat + + +async def _upsert_channel( + db: AsyncSession, + ch_data: dict, + category: Category | None, + ctype: ContentType, + provider_id: int, + client: XtreamClient, +) -> Channel | None: + stream_id = str(ch_data.get("stream_id") or ch_data.get("series_id", "")) + if not stream_id: + return None + + result = await db.execute( + select(Channel).where( + Channel.stream_id_at_provider == stream_id, + Channel.type == ctype, + ) + ) + channel = result.scalar_one_or_none() + + name = ch_data.get("name") or ch_data.get("title", "Unknown") or "Unknown" + tvg_id = ch_data.get("epg_channel_id") or ch_data.get("tvg_id") or None + logo = ch_data.get("stream_icon") or ch_data.get("cover") or None + # Truncate logo to avoid DB column limit (base64 images from some providers) + if logo and len(logo) > 900: + logo = None + cat_id = category.id if category else None + + if not channel: + channel = Channel( + name=name, + tvg_id=tvg_id, + tvg_logo=logo, + stream_id_at_provider=stream_id, + category_id=cat_id, + type=ctype, + ) + db.add(channel) + await db.flush() + else: + channel.name = name + channel.tvg_id = tvg_id + channel.tvg_logo = logo + # Only update category if channel has none yet (first-provider-wins prevents + # cross-provider syncs from breaking existing catalog assignments) + if cat_id and not channel.category_id: + channel.category_id = cat_id + + # Build stream URL + container_ext = ch_data.get("container_extension", "ts") or "ts" + if ctype == ContentType.live: + url = client.build_live_stream_url(stream_id) + elif ctype == ContentType.movie: + url = client.build_vod_stream_url(stream_id, container_ext) + else: + url = client.build_series_stream_url(stream_id, container_ext) + + # Upsert provider map + result = await db.execute( + select(ChannelProviderMap).where( + ChannelProviderMap.channel_id == channel.id, + ChannelProviderMap.provider_account_id == provider_id, + ) + ) + pmap = result.scalar_one_or_none() + if not pmap: + pmap = ChannelProviderMap( + channel_id=channel.id, + provider_account_id=provider_id, + stream_url=url, + ) + db.add(pmap) + else: + pmap.stream_url = url + + return channel diff --git a/backend/api/admin/settings.py b/backend/api/admin/settings.py new file mode 100644 index 0000000..99fa41d --- /dev/null +++ b/backend/api/admin/settings.py @@ -0,0 +1,38 @@ +"""Admin settings — blocked image upload/management.""" +import os + +from fastapi import APIRouter, Depends, HTTPException, UploadFile, File +from fastapi.responses import FileResponse + +from ..auth import get_current_admin + +router = APIRouter(prefix="/settings", tags=["settings"]) + +BLOCKED_IMAGE_PATH = "/opt/kirastream/backend/static/blocked_image.jpg" +MAX_SIZE = 10 * 1024 * 1024 # 10 MB + + +@router.get("/blocked-image") +async def get_blocked_image(_=Depends(get_current_admin)): + if not os.path.exists(BLOCKED_IMAGE_PATH): + raise HTTPException(404, "No blocked image configured") + return FileResponse(BLOCKED_IMAGE_PATH, media_type="image/jpeg") + + +@router.post("/blocked-image", status_code=201) +async def upload_blocked_image(file: UploadFile = File(...), _=Depends(get_current_admin)): + if file.content_type not in ("image/jpeg", "image/png", "image/webp", "image/gif"): + raise HTTPException(400, "Only JPEG, PNG, WebP or GIF images allowed") + data = await file.read() + if len(data) > MAX_SIZE: + raise HTTPException(413, "Image too large (max 10 MB)") + os.makedirs(os.path.dirname(BLOCKED_IMAGE_PATH), exist_ok=True) + with open(BLOCKED_IMAGE_PATH, "wb") as f: + f.write(data) + return {"ok": True, "size": len(data)} + + +@router.delete("/blocked-image", status_code=204) +async def delete_blocked_image(_=Depends(get_current_admin)): + if os.path.exists(BLOCKED_IMAGE_PATH): + os.remove(BLOCKED_IMAGE_PATH) diff --git a/backend/api/admin/users.py b/backend/api/admin/users.py new file mode 100644 index 0000000..ff6e5ed --- /dev/null +++ b/backend/api/admin/users.py @@ -0,0 +1,267 @@ +"""Admin API: user management.""" +from datetime import datetime +from fastapi import APIRouter, Depends, HTTPException +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload +from pydantic import BaseModel + +from ...database import get_db +from ...models.user import User, UserCatalogEntry, UserCustomCatalogEntry, UserProviderPreference +from ...models.channel import Category +from ...models.provider import ProviderAccount +from ...models.custom_category import CustomCategory +from ..auth import get_current_admin + +router = APIRouter(prefix="/users", tags=["users"]) + + +class UserCreate(BaseModel): + username: str + password: str + max_connections: int = 1 + expiry_date: datetime | None = None + is_active: bool = True + is_priority: bool = False + + +class UserUpdate(BaseModel): + password: str | None = None + max_connections: int | None = None + expiry_date: datetime | None = None + is_active: bool | None = None + is_priority: bool | None = None + + +class UserOut(BaseModel): + id: int + username: str + max_connections: int + expiry_date: datetime | None + is_active: bool + is_priority: bool + created_at: datetime + + class Config: + from_attributes = True + + +@router.get("/", response_model=list[UserOut]) +async def list_users(db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(User).order_by(User.id)) + return result.scalars().all() + + +@router.post("/", response_model=UserOut) +async def create_user(data: UserCreate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + existing = await db.execute(select(User).where(User.username == data.username)) + if existing.scalar_one_or_none(): + raise HTTPException(400, f"Username '{data.username}' already exists") + user = User( + username=data.username, + max_connections=data.max_connections, + expiry_date=data.expiry_date, + is_active=data.is_active, + is_priority=data.is_priority, + password_hash="", + ) + user.set_password(data.password) + db.add(user) + await db.commit() + await db.refresh(user) + return user + + +@router.put("/{user_id}", response_model=UserOut) +async def update_user(user_id: int, data: UserUpdate, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(User).where(User.id == user_id)) + user = result.scalar_one_or_none() + if not user: + raise HTTPException(404, "User not found") + if data.password is not None: + user.set_password(data.password) + if data.max_connections is not None: + user.max_connections = data.max_connections + if data.expiry_date is not None: + user.expiry_date = data.expiry_date + if data.is_active is not None: + user.is_active = data.is_active + if data.is_priority is not None: + user.is_priority = data.is_priority + await db.commit() + await db.refresh(user) + return user + + +@router.delete("/{user_id}") +async def delete_user(user_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(User).where(User.id == user_id)) + user = result.scalar_one_or_none() + if not user: + raise HTTPException(404, "User not found") + await db.delete(user) + await db.commit() + return {"ok": True} + + +@router.get("/{user_id}/catalog") +async def get_user_catalog(user_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(UserCatalogEntry) + .options(selectinload(UserCatalogEntry.category)) + .where(UserCatalogEntry.user_id == user_id) + ) + entries = result.scalars().all() + return [ + {"id": e.id, "category_id": e.category_id, "category_name": e.category.name, "type": e.category.type} + for e in entries + ] + + +@router.post("/{user_id}/catalog") +async def assign_categories(user_id: int, category_ids: list[int], db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(User).where(User.id == user_id)) + if not result.scalar_one_or_none(): + raise HTTPException(404, "User not found") + + # Remove existing entries + existing = await db.execute(select(UserCatalogEntry).where(UserCatalogEntry.user_id == user_id)) + for entry in existing.scalars().all(): + await db.delete(entry) + + # Add new entries + added = 0 + for cat_id in category_ids: + cat_result = await db.execute(select(Category).where(Category.id == cat_id)) + if cat_result.scalar_one_or_none(): + db.add(UserCatalogEntry(user_id=user_id, category_id=cat_id)) + added += 1 + + await db.commit() + return {"ok": True, "assigned": added} + + +@router.delete("/{user_id}/catalog/{category_id}") +async def remove_category(user_id: int, category_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(UserCatalogEntry).where( + UserCatalogEntry.user_id == user_id, + UserCatalogEntry.category_id == category_id, + ) + ) + entry = result.scalar_one_or_none() + if not entry: + raise HTTPException(404, "Catalog entry not found") + await db.delete(entry) + await db.commit() + return {"ok": True} + + +@router.get("/{user_id}/custom-catalog") +async def get_user_custom_catalog(user_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(UserCustomCatalogEntry.custom_category_id).where(UserCustomCatalogEntry.user_id == user_id) + ) + return [row[0] for row in result.all()] + + +@router.post("/{user_id}/custom-catalog") +async def assign_custom_categories(user_id: int, custom_category_ids: list[int], db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute(select(User).where(User.id == user_id)) + if not result.scalar_one_or_none(): + raise HTTPException(404, "User not found") + + existing = await db.execute(select(UserCustomCatalogEntry).where(UserCustomCatalogEntry.user_id == user_id)) + for entry in existing.scalars().all(): + await db.delete(entry) + + added = 0 + for cc_id in custom_category_ids: + cc_result = await db.execute(select(CustomCategory).where(CustomCategory.id == cc_id)) + if cc_result.scalar_one_or_none(): + db.add(UserCustomCatalogEntry(user_id=user_id, custom_category_id=cc_id)) + added += 1 + + await db.commit() + return {"ok": True, "assigned": added} + + +# --------------------------------------------------------------------------- +# Provider preferences +# --------------------------------------------------------------------------- + +class ProviderPrefIn(BaseModel): + provider_account_id: int + priority: int = 0 + + +@router.get("/{user_id}/providers") +async def get_user_provider_prefs(user_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin)): + result = await db.execute( + select(UserProviderPreference) + .options(selectinload(UserProviderPreference.provider_account)) + .where(UserProviderPreference.user_id == user_id) + .order_by(UserProviderPreference.priority) + ) + prefs = result.scalars().all() + return [ + { + "id": p.id, + "provider_account_id": p.provider_account_id, + "provider_name": p.provider_account.name, + "priority": p.priority, + } + for p in prefs + ] + + +@router.post("/{user_id}/providers") +async def add_user_provider_pref( + user_id: int, data: ProviderPrefIn, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin) +): + user_result = await db.execute(select(User).where(User.id == user_id)) + if not user_result.scalar_one_or_none(): + raise HTTPException(404, "User not found") + + provider_result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == data.provider_account_id)) + if not provider_result.scalar_one_or_none(): + raise HTTPException(404, "Provider account not found") + + # Upsert + existing = await db.execute( + select(UserProviderPreference).where( + UserProviderPreference.user_id == user_id, + UserProviderPreference.provider_account_id == data.provider_account_id, + ) + ) + pref = existing.scalar_one_or_none() + if pref: + pref.priority = data.priority + else: + pref = UserProviderPreference( + user_id=user_id, + provider_account_id=data.provider_account_id, + priority=data.priority, + ) + db.add(pref) + + await db.commit() + return {"ok": True} + + +@router.delete("/{user_id}/providers/{provider_account_id}") +async def remove_user_provider_pref( + user_id: int, provider_account_id: int, db: AsyncSession = Depends(get_db), _=Depends(get_current_admin) +): + result = await db.execute( + select(UserProviderPreference).where( + UserProviderPreference.user_id == user_id, + UserProviderPreference.provider_account_id == provider_account_id, + ) + ) + pref = result.scalar_one_or_none() + if not pref: + raise HTTPException(404, "Preference not found") + await db.delete(pref) + await db.commit() + return {"ok": True} diff --git a/backend/api/auth.py b/backend/api/auth.py new file mode 100644 index 0000000..d158e78 --- /dev/null +++ b/backend/api/auth.py @@ -0,0 +1,47 @@ +"""JWT authentication for the admin panel.""" +from datetime import datetime, timedelta, timezone +from fastapi import Depends, HTTPException, status +from fastapi.security import OAuth2PasswordBearer, OAuth2PasswordRequestForm +from jose import JWTError, jwt +from pydantic import BaseModel + +from ..config import settings + +oauth2_scheme = OAuth2PasswordBearer(tokenUrl="/api/admin/auth/token") + + +class Token(BaseModel): + access_token: str + token_type: str + + +def create_access_token(data: dict) -> str: + to_encode = data.copy() + expire = datetime.now(timezone.utc) + timedelta(minutes=settings.access_token_expire_minutes) + to_encode["exp"] = expire + return jwt.encode(to_encode, settings.secret_key, algorithm=settings.algorithm) + + +async def get_current_admin(token: str = Depends(oauth2_scheme)) -> str: + credentials_exception = HTTPException( + status_code=status.HTTP_401_UNAUTHORIZED, + detail="Invalid credentials", + headers={"WWW-Authenticate": "Bearer"}, + ) + try: + payload = jwt.decode(token, settings.secret_key, algorithms=[settings.algorithm]) + username: str = payload.get("sub") + if username is None: + raise credentials_exception + except JWTError: + raise credentials_exception + if username != settings.admin_username: + raise credentials_exception + return username + + +async def login(form_data: OAuth2PasswordRequestForm = Depends()) -> Token: + if form_data.username != settings.admin_username or form_data.password != settings.admin_password: + raise HTTPException(status_code=400, detail="Incorrect username or password") + token = create_access_token({"sub": form_data.username}) + return Token(access_token=token, token_type="bearer") diff --git a/backend/api/xtream.py b/backend/api/xtream.py new file mode 100644 index 0000000..b286f1d --- /dev/null +++ b/backend/api/xtream.py @@ -0,0 +1,928 @@ +"""Xtream Codes compatible API — used by IPTV player apps.""" +import asyncio +import logging +import time +from datetime import datetime, timezone +from typing import AsyncIterator + +import aiohttp +from fastapi import APIRouter, Depends, HTTPException, Request, Response +from fastapi.responses import StreamingResponse, PlainTextResponse +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from ..config import settings +from ..core.catalog import get_user_categories, get_user_channels, get_channel_provider_maps, can_user_access_channel, get_user_preferred_provider_ids +from ..core.epg_manager import filter_epg_for_channels +from ..core.pool import pool, NoSlotsAvailableError, MaxConnectionsExceededError +from ..core.xtream_client import XtreamClient +from ..core.vod_tracker import vod_tracker, VodSession +from ..database import get_db, AsyncSessionLocal +from ..models.channel import Channel, ContentType +from ..models.custom_category import CustomCategory, CustomCategoryItem +from ..models.jellyfin import JellyfinConfig, JellyfinItem +from ..models.log import ConnectionLog +from ..models.provider import ProviderAccount +from ..models.user import User, UserCustomCatalogEntry + +CC_PREFIX = "cc_" # prefix for custom category IDs in Xtream protocol +BLOCKED_IMAGE_PATH = "/opt/kirastream/backend/static/blocked_image.jpg" + +# episode_id → provider_account_id; populated by get_series_info calls so +# series_stream can route episode requests without storing episodes in the DB +_episode_provider_cache: dict[str, int] = {} + +# jellyfin fake_ep_id → direct-play URL; populated in _get_jellyfin_series_info +_jellyfin_episode_cache: dict[str, str] = {} + +logger = logging.getLogger(__name__) +router = APIRouter(tags=["xtream"]) + +SERVER_URL_PLACEHOLDER = "{server_url}" + + +def get_client_ip(request: Request) -> str: + xff = request.headers.get("X-Forwarded-For", "") + if xff: + return xff.split(",")[0].strip() + xri = request.headers.get("X-Real-IP", "") + if xri: + return xri + return request.client.host if request.client else "unknown" + + +async def _create_log( + user_id: int, + username: str, + channel_id: int | None, + channel_name: str | None, + content_type: str, + stream_id: str | None, + client_ip: str, +) -> int: + async with AsyncSessionLocal() as db: + log = ConnectionLog( + user_id=user_id, + username=username, + channel_id=channel_id, + channel_name=channel_name, + content_type=content_type, + stream_id=stream_id, + client_ip=client_ip, + ) + db.add(log) + await db.commit() + await db.refresh(log) + return log.id + + +async def _finish_log(log_id: int, bytes_transferred: int, started: float) -> None: + ended = datetime.now(timezone.utc) + duration = int(time.time() - started) + async with AsyncSessionLocal() as db: + result = await db.execute(select(ConnectionLog).where(ConnectionLog.id == log_id)) + log = result.scalar_one_or_none() + if log: + log.ended_at = ended + log.duration_seconds = duration + log.bytes_transferred = bytes_transferred + await db.commit() + + +async def _stream_blocked_image() -> StreamingResponse: + """Return a continuous MPEG-TS video stream of the blocked image via FFmpeg.""" + import os + + if not os.path.exists(BLOCKED_IMAGE_PATH): + raise HTTPException(503, "No provider slots available — try again later") + + async def generate(): + proc = await asyncio.create_subprocess_exec( + "ffmpeg", + "-re", "-loop", "1", "-i", BLOCKED_IMAGE_PATH, + "-c:v", "libx264", "-preset", "ultrafast", "-tune", "stillimage", + "-b:v", "400k", "-pix_fmt", "yuv420p", + "-vf", "scale=1280:720", + "-f", "mpegts", "pipe:1", + "-loglevel", "quiet", + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.DEVNULL, + ) + try: + while True: + chunk = await proc.stdout.read(65536) + if not chunk: + break + yield chunk + finally: + try: + proc.terminate() + await asyncio.wait_for(proc.wait(), timeout=2.0) + except (asyncio.TimeoutError, ProcessLookupError): + try: + proc.kill() + except ProcessLookupError: + pass + + return StreamingResponse( + generate(), + media_type="video/mp2t", + headers={"Cache-Control": "no-cache", "X-Accel-Buffering": "no"}, + ) + + +async def _get_user_custom_cat_ids(db: AsyncSession, user_id: int) -> set[int] | None: + """Returns set of custom category IDs for the user, or None if unrestricted (show all).""" + result = await db.execute( + select(UserCustomCatalogEntry.custom_category_id) + .where(UserCustomCatalogEntry.user_id == user_id) + ) + rows = result.scalars().all() + return set(rows) if rows else None # None means "no restriction — show all" + + +async def _can_access_via_custom_category(db: AsyncSession, channel_id: int, user_id: int) -> bool: + allowed_ids = await _get_user_custom_cat_ids(db, user_id) + q = select(CustomCategoryItem).where(CustomCategoryItem.channel_id == channel_id) + if allowed_ids is not None: + q = q.where(CustomCategoryItem.custom_category_id.in_(allowed_ids)) + result = await db.execute(q.limit(1)) + return result.scalar_one_or_none() is not None + + +async def _get_custom_category_channels(db: AsyncSession, cc_id: int) -> list[Channel]: + result = await db.execute( + select(Channel) + .join(CustomCategoryItem, CustomCategoryItem.channel_id == Channel.id) + .options(selectinload(Channel.provider_maps)) + .where(CustomCategoryItem.custom_category_id == cc_id, Channel.is_active == True) # noqa: E712 + .order_by(CustomCategoryItem.position, CustomCategoryItem.id) + ) + return list(result.scalars().all()) + + +# --------------------------------------------------------------------------- +# Auth helper +# --------------------------------------------------------------------------- + +async def authenticate_user(username: str, password: str, db: AsyncSession) -> User: + result = await db.execute(select(User).where(User.username == username, User.is_active == True)) # noqa: E712 + user = result.scalar_one_or_none() + if not user: + raise HTTPException(403, "Invalid credentials") + if not user.verify_password(password): + raise HTTPException(403, "Invalid credentials") + if user.expiry_date and user.expiry_date < datetime.now(timezone.utc): + raise HTTPException(403, "Account expired") + return user + + +def server_url(request: Request) -> str: + return f"{request.url.scheme}://{request.url.netloc}" + + +# --------------------------------------------------------------------------- +# player_api.php (main Xtream Codes endpoint) +# --------------------------------------------------------------------------- + +@router.get("/player_api.php") +async def player_api( + request: Request, + username: str = "", + password: str = "", + action: str = "", + category_id: str | None = None, + stream_id: str | None = None, + series_id: str | None = None, + vod_id: str | None = None, + db: AsyncSession = Depends(get_db), +): + if not username or not password: + return {"user_info": {"status": "Disabled"}, "server_info": {}} + + user = await authenticate_user(username, password, db) + base = server_url(request) + + if not action: + return await _user_info(user, password, base, db) + + if action in ("user_info", "get_account_info"): + return await _user_info(user, password, base, db) + + if action == "get_live_categories": + return await _get_live_categories(user, db) + + if action == "get_live_streams": + return await _get_live_streams(user, db, category_id, base) + + if action == "get_vod_categories": + return await _get_categories(user, db, ContentType.movie) + + if action == "get_vod_streams": + return await _get_channels(user, db, ContentType.movie, category_id, base) + + if action == "get_series_categories": + return await _get_categories(user, db, ContentType.series) + + if action == "get_series": + return await _get_channels(user, db, ContentType.series, category_id, base) + + if action == "get_series_info" and series_id: + return await _get_series_info(series_id, user, db) + + if action == "get_vod_info" and vod_id: + return await _get_vod_info(vod_id, user, db) + + if action == "get_short_epg" and stream_id: + return {"epg_listings": []} + + return {} + + +# --------------------------------------------------------------------------- +# Playlist endpoint +# --------------------------------------------------------------------------- + +@router.get("/get.php") +async def get_playlist( + request: Request, + username: str = "", + password: str = "", + type: str = "m3u_plus", + output: str = "ts", + db: AsyncSession = Depends(get_db), +): + user = await authenticate_user(username, password, db) + base = server_url(request) + + channels = await get_user_channels(db, user) + lines = ["#EXTM3U"] + for ch in channels: + cat_name = ch.category.name if ch.category else "" + tvg_id = ch.tvg_id or "" + logo = ch.tvg_logo or "" + if ch.type == ContentType.live: + url = f"{base}/{username}/{password}/{ch.stream_id_at_provider}" + elif ch.type == ContentType.movie: + ext = "mkv" + url = f"{base}/movie/{username}/{password}/{ch.stream_id_at_provider}.{ext}" + else: + url = f"{base}/series/{username}/{password}/{ch.stream_id_at_provider}.mkv" + + lines.append( + f'#EXTINF:-1 tvg-id="{tvg_id}" tvg-logo="{logo}" group-title="{cat_name}",{ch.name}' + ) + lines.append(url) + + return PlainTextResponse("\n".join(lines), media_type="application/x-mpegurl") + + +# --------------------------------------------------------------------------- +# EPG endpoint +# --------------------------------------------------------------------------- + +@router.get("/xmltv.php") +async def xmltv( + username: str = "", + password: str = "", + db: AsyncSession = Depends(get_db), +): + user = await authenticate_user(username, password, db) + channels = await get_user_channels(db, user) + tvg_ids = {ch.tvg_id for ch in channels if ch.tvg_id} + epg_data = filter_epg_for_channels(tvg_ids) + return Response(content=epg_data, media_type="application/xml") + + +# --------------------------------------------------------------------------- +# Live stream proxy /{username}/{password}/{stream_id} +# Also handles /live/{username}/{password}/{stream_id} used by Smarters/IPTVnator +# --------------------------------------------------------------------------- + +@router.get("/live/{username}/{password}/{stream_id}") +@router.get("/{username}/{password}/{stream_id}") +async def live_stream( + username: str, + password: str, + stream_id: str, + request: Request, + db: AsyncSession = Depends(get_db), +): + # Strip extension if present (e.g. "123456.ts" -> "123456") + stream_id_clean = stream_id.rsplit(".", 1)[0] if "." in stream_id else stream_id + + user = await authenticate_user(username, password, db) + + # Resolve channel by stream_id_at_provider + result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == stream_id_clean, Channel.type == ContentType.live, Channel.is_active == True) # noqa: E712 + ) + channel = result.scalar_one_or_none() + if not channel: + raise HTTPException(404, "Channel not found") + + # Check user can access this channel (regular catalog or custom category) + if not await can_user_access_channel(db, user, channel.id): + if not await _can_access_via_custom_category(db, channel.id, user.id): + raise HTTPException(403, "Channel not in your catalog") + + provider_maps = await get_channel_provider_maps(db, channel.id) + if not provider_maps: + raise HTTPException(503, "No provider available for this channel") + + preferred_ids = await get_user_preferred_provider_ids(db, user) + + try: + handle = await pool.acquire( + channel_id=channel.id, + stream_url_resolver=None, + provider_maps=provider_maps, + user_id=str(user.id), + user_max_conns=user.max_connections, + is_priority=user.is_priority, + preferred_provider_ids=preferred_ids, + username=user.username, + channel_name=channel.name, + ) + except MaxConnectionsExceededError: + return await _stream_blocked_image() + except NoSlotsAvailableError: + raise HTTPException(503, "No provider slots available — try again later") + + client_ip = get_client_ip(request) + log_id = await _create_log(user.id, user.username, channel.id, channel.name, "live", stream_id_clean, client_ip) + stream_started = time.time() + + async def stream_generator() -> AsyncIterator[bytes]: + bytes_sent = 0 + try: + async for chunk in handle.read(): + bytes_sent += len(chunk) + yield chunk + finally: + try: + await asyncio.shield(pool.release(channel.id, handle.client_id, str(user.id))) + except asyncio.CancelledError: + pass + asyncio.create_task(_finish_log(log_id, bytes_sent, stream_started)) + + return StreamingResponse( + stream_generator(), + media_type="video/mp2t", + headers={ + "Cache-Control": "no-cache", + "X-Accel-Buffering": "no", + }, + ) + + +# --------------------------------------------------------------------------- +# VOD proxy /movie/{username}/{password}/{stream_id}.ext +# --------------------------------------------------------------------------- + +@router.get("/movie/{username}/{password}/{stream_id}") +async def vod_stream( + username: str, + password: str, + stream_id: str, + request: Request, + db: AsyncSession = Depends(get_db), +): + # Parse extension + parts = stream_id.rsplit(".", 1) + sid = parts[0] + ext = parts[1] if len(parts) > 1 else "mkv" + + user = await authenticate_user(username, password, db) + + result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == sid, Channel.type == ContentType.movie) + ) + channel = result.scalar_one_or_none() + # Fallback: Jellyfin channels have non-numeric stream_id_at_provider so the app + # receives ch.id (DB int) as the stream_id — look it up by primary key. + if not channel: + try: + ch_id = int(sid) + fb = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.id == ch_id, Channel.type == ContentType.movie) + ) + channel = fb.scalar_one_or_none() + except (ValueError, TypeError): + pass + if not channel: + raise HTTPException(404, "VOD not found") + + if not await can_user_access_channel(db, user, channel.id): + if not await _can_access_via_custom_category(db, channel.id, user.id): + raise HTTPException(403, "Not in your catalog") + + if not channel.provider_maps: + raise HTTPException(503, "No provider available") + + pmap = channel.provider_maps[0] + prov_res = await db.execute(select(ProviderAccount).where(ProviderAccount.id == pmap.provider_account_id)) + provider = prov_res.scalar_one_or_none() + vod_session = vod_tracker.start( + user_id=str(user.id), + username=user.username, + channel_id=channel.id, + channel_name=channel.name, + provider_account_id=pmap.provider_account_id, + provider_name=provider.name if provider else f"#{pmap.provider_account_id}", + stream_type="movie", + stream_url=pmap.stream_url, + user_max_connections=user.max_connections, + ) + client_ip = get_client_ip(request) + log_id = await _create_log(user.id, user.username, channel.id, channel.name, "movie", sid, client_ip) + return await _proxy_vod(pmap.stream_url, request, vod_session=vod_session, log_id=log_id) + + +# --------------------------------------------------------------------------- +# Series proxy /series/{username}/{password}/{stream_id}.ext +# --------------------------------------------------------------------------- + +@router.get("/series/{username}/{password}/{stream_id}") +async def series_stream( + username: str, + password: str, + stream_id: str, + request: Request, + db: AsyncSession = Depends(get_db), +): + parts = stream_id.rsplit(".", 1) + sid = parts[0] + ext = parts[1] if len(parts) > 1 else "mkv" + + user = await authenticate_user(username, password, db) + + # First: try the episode as a stored channel (future: when episodes are synced) + result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == sid, Channel.type == ContentType.series) + ) + channel = result.scalar_one_or_none() + client_ip = get_client_ip(request) + + if channel and channel.provider_maps: + if not await can_user_access_channel(db, user, channel.id): + if not await _can_access_via_custom_category(db, channel.id, user.id): + raise HTTPException(403, "Not in your catalog") + pmap = channel.provider_maps[0] + prov_res = await db.execute(select(ProviderAccount).where(ProviderAccount.id == pmap.provider_account_id)) + provider = prov_res.scalar_one_or_none() + vod_session = vod_tracker.start( + user_id=str(user.id), username=user.username, + channel_id=channel.id, channel_name=channel.name, + provider_account_id=pmap.provider_account_id, + provider_name=provider.name if provider else f"#{pmap.provider_account_id}", + stream_type="series", + stream_url=pmap.stream_url, + user_max_connections=user.max_connections, + ) + log_id = await _create_log(user.id, user.username, channel.id, channel.name, "series", sid, client_ip) + return await _proxy_vod(pmap.stream_url, request, vod_session=vod_session, log_id=log_id) + + # Second: episode_id was cached when the app called get_series_info + provider_id = _episode_provider_cache.get(sid) + if provider_id: + prov_result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == provider_id)) + provider = prov_result.scalar_one_or_none() + if provider: + client = XtreamClient(provider.base_url, provider.username, provider.password) + url = client.build_series_stream_url(sid, ext) + vod_session = vod_tracker.start( + user_id=str(user.id), username=user.username, + channel_id=0, channel_name=f"Episode {sid}", + provider_account_id=provider_id, + provider_name=provider.name, + stream_type="series", + stream_url=url, + user_max_connections=user.max_connections, + ) + log_id = await _create_log(user.id, user.username, 0, f"Episode {sid}", "series", sid, client_ip) + return await _proxy_vod(url, request, vod_session=vod_session, log_id=log_id) + + # Third: check if it's a cached Jellyfin episode (fake_id → direct-play URL) + jelly_url = _jellyfin_episode_cache.get(sid) + if jelly_url: + vod_session = vod_tracker.start( + user_id=str(user.id), username=user.username, + channel_id=0, channel_name=f"Episode {sid}", + provider_account_id=0, + provider_name="Jellyfin", + stream_type="series", + stream_url=jelly_url, + user_max_connections=user.max_connections, + ) + log_id = await _create_log(user.id, user.username, 0, f"Episode {sid}", "series", sid, client_ip) + return await _proxy_vod(jelly_url, request, vod_session=vod_session, log_id=log_id) + + raise HTTPException(404, "Episode not found — open the series detail first to load episode info") + + +async def _proxy_vod( + upstream_url: str, + request: Request, + vod_session: VodSession | None = None, + log_id: int | None = None, +) -> StreamingResponse: + """Transparent proxy for VOD/series — forwards status, Content-Type, and range headers.""" + req_headers = {} + if "Range" in request.headers: + req_headers["Range"] = request.headers["Range"] + + timeout = aiohttp.ClientTimeout(connect=10, sock_read=300) + http_session = aiohttp.ClientSession(timeout=timeout) + if vod_session: + vod_session._http_session = http_session + try: + resp = await http_session.get(upstream_url, headers=req_headers, ssl=False) + except Exception as e: + await http_session.close() + if vod_session: + vod_tracker.end(vod_session.session_id) + raise HTTPException(502, f"Provider unreachable: {e}") + + content_type = resp.headers.get("Content-Type", "application/octet-stream") + forward_headers: dict[str, str] = {"Cache-Control": "no-cache"} + for h in ("Content-Length", "Content-Range", "Accept-Ranges"): + if h in resp.headers: + forward_headers[h] = resp.headers[h] + + log_started = time.time() + + async def generate(): + prev_bytes = 0 + prev_time = time.time() + bytes_sent = 0 + try: + async for chunk in resp.content.iter_chunked(65536): + if vod_session and vod_session.should_stop: + break + bytes_sent += len(chunk) + if vod_session: + now = time.time() + vod_session.bytes_pumped += len(chunk) + vod_session.last_active = now + if now - prev_time >= 2.0: + bps = (vod_session.bytes_pumped - prev_bytes) / (now - prev_time) + vod_session.bps_down = bps + vod_session.bps_up = bps + prev_bytes = vod_session.bytes_pumped + prev_time = now + yield chunk + finally: + resp.release() + await http_session.close() + if vod_session: + vod_session.running = False + vod_tracker.end(vod_session.session_id) + if log_id: + asyncio.create_task(_finish_log(log_id, bytes_sent, log_started)) + + return StreamingResponse( + generate(), + status_code=resp.status, + media_type=content_type, + headers=forward_headers, + ) + + +# --------------------------------------------------------------------------- +# Internal helpers +# --------------------------------------------------------------------------- + +async def _user_info(user: User, password: str, base: str, db: AsyncSession) -> dict: + exp = int(user.expiry_date.timestamp()) if user.expiry_date else 4102444800 # 2100-01-01 + return { + "user_info": { + "username": user.username, + "password": password, + "message": "KiraStream", + "auth": 1, + "status": "Active" if user.is_active else "Disabled", + "exp_date": str(exp), + "is_trial": "0", + "active_cons": "0", + "created_at": str(int(user.created_at.timestamp())), + "max_connections": str(user.max_connections), + "allowed_output_formats": ["ts", "m3u8", "rtmp"], + }, + "server_info": { + "url": base, + "port": "80", + "https_port": "443", + "server_protocol": "http", + "rtmp_port": "1935", + "timezone": "Europe/Madrid", + "timestamp_now": int(time.time()), + "time_now": datetime.now().strftime("%Y-%m-%d %H:%M:%S"), + }, + } + + +async def _get_custom_cats(db: AsyncSession, ctype: ContentType, user_id: int) -> list[dict]: + allowed_ids = await _get_user_custom_cat_ids(db, user_id) + q = ( + select(CustomCategory) + .where(CustomCategory.type == ctype, CustomCategory.is_visible == True) # noqa: E712 + .order_by(CustomCategory.position, CustomCategory.id) + ) + if allowed_ids is not None: + q = q.where(CustomCategory.id.in_(allowed_ids)) + result = await db.execute(q) + return [ + {"category_id": f"{CC_PREFIX}{c.id}", "category_name": c.name, "parent_id": 0} + for c in result.scalars().all() + ] + + +async def _get_live_categories(user: User, db: AsyncSession) -> list[dict]: + cats = await get_user_categories(db, user, ContentType.live) + result = [{"category_id": str(c.id), "category_name": c.name, "parent_id": 0} for c in cats] + result += await _get_custom_cats(db, ContentType.live, user.id) + return result + + +async def _get_categories(user: User, db: AsyncSession, ctype: ContentType) -> list[dict]: + cats = await get_user_categories(db, user, ctype) + result = [{"category_id": str(c.id), "category_name": c.name, "parent_id": 0} for c in cats] + result += await _get_custom_cats(db, ctype, user.id) + return result + + +async def _get_live_streams(user: User, db: AsyncSession, category_id: str | None, base: str) -> list[dict]: + if category_id and category_id.startswith(CC_PREFIX): + cc_id = int(category_id[len(CC_PREFIX):]) + channels = await _get_custom_category_channels(db, cc_id) + else: + cat_id = int(category_id) if category_id else None + channels = await get_user_channels(db, user, ContentType.live, cat_id) + return [ + { + "num": i + 1, + "name": ch.name, + "stream_type": "live", + "stream_id": int(ch.stream_id_at_provider) if ch.stream_id_at_provider.isdigit() else ch.id, + "stream_icon": ch.tvg_logo or "", + "epg_channel_id": ch.tvg_id or "", + "added": "0", + "category_id": str(ch.category_id) if ch.category_id else "0", + "custom_sid": "", + "tv_archive": 0, + "direct_source": "", + "tv_archive_duration": 0, + } + for i, ch in enumerate(channels) + ] + + +async def _get_channels(user: User, db: AsyncSession, ctype: ContentType, category_id: str | None, base: str) -> list[dict]: + if category_id and category_id.startswith(CC_PREFIX): + cc_id = int(category_id[len(CC_PREFIX):]) + channels = await _get_custom_category_channels(db, cc_id) + else: + cat_id = int(category_id) if category_id else None + channels = await get_user_channels(db, user, ctype, cat_id) + if ctype == ContentType.movie: + return [ + { + "num": i + 1, + "name": ch.name, + "stream_type": "movie", + "stream_id": int(ch.stream_id_at_provider) if ch.stream_id_at_provider.isdigit() else ch.id, + "stream_icon": ch.tvg_logo or "", + "added": "0", + "category_id": str(ch.category_id) if ch.category_id else "0", + "category_ids": [str(ch.category_id) if ch.category_id else "0"], + "container_extension": "mkv", + } + for i, ch in enumerate(channels) + ] + # Series: must return series_id (not stream_id) so apps can call get_series_info + return [ + { + "num": i + 1, + "name": ch.name, + "series_id": int(ch.stream_id_at_provider) if ch.stream_id_at_provider.isdigit() else ch.id, + "stream_id": int(ch.stream_id_at_provider) if ch.stream_id_at_provider.isdigit() else ch.id, + "cover": ch.tvg_logo or "", + "stream_icon": ch.tvg_logo or "", + "plot": "", + "cast": "", + "director": "", + "genre": "", + "release_date": "", + "last_modified": "0", + "rating": "", + "rating_5based": 0, + "backdrop_path": [], + "youtube_trailer": "", + "episode_run_time": "", + "added": "0", + "category_id": str(ch.category_id) if ch.category_id else "0", + "category_ids": [str(ch.category_id) if ch.category_id else "0"], + "container_extension": "mkv", + } + for i, ch in enumerate(channels) + ] + + +async def _get_series_info(series_id: str, user: User, db: AsyncSession) -> dict: + result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == series_id, Channel.type == ContentType.series) + ) + ch = result.scalar_one_or_none() + + # Fallback: Jellyfin series have non-numeric stream_id_at_provider so the app + # receives ch.id (DB int) as series_id — look it up by primary key. + if not ch: + try: + ch_id = int(series_id) + fb = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.id == ch_id, Channel.type == ContentType.series) + ) + ch = fb.scalar_one_or_none() + except (ValueError, TypeError): + pass + + if not ch: + return {"info": {}, "episodes": {}} + + # Check if this channel belongs to a Jellyfin config + ji_result = await db.execute( + select(JellyfinItem).where(JellyfinItem.channel_id == ch.id) + ) + ji = ji_result.scalar_one_or_none() + if ji: + cfg_result = await db.execute( + select(JellyfinConfig).where(JellyfinConfig.id == ji.jellyfin_config_id) + ) + cfg = cfg_result.scalar_one_or_none() + if cfg: + return await _get_jellyfin_series_info(ch, ji, cfg) + + if not ch.provider_maps: + return {"info": {}, "episodes": {}} + + pmap = ch.provider_maps[0] + prov_result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == pmap.provider_account_id)) + provider = prov_result.scalar_one_or_none() + if not provider: + return {"info": {}, "episodes": {}} + client = XtreamClient(provider.base_url, provider.username, provider.password) + try: + info = await client.get_series_info(series_id) + # Cache episode_id → provider_id so series_stream can route the playback request + for season_eps in (info.get("episodes") or {}).values(): + if isinstance(season_eps, list): + for ep in season_eps: + ep_id = str(ep.get("id", "")) + if ep_id: + _episode_provider_cache[ep_id] = provider.id + # Ensure cover is populated (some providers return it here, some in the list) + if info.get("info") is not None and not info["info"].get("cover"): + info["info"]["cover"] = ch.tvg_logo or "" + return info + except Exception as e: + logger.warning(f"Series info fetch failed for series_id={series_id}: {e}") + return { + "info": {"name": ch.name, "cover": ch.tvg_logo or "", "plot": "", "cast": "", "director": "", "genre": "", "rating": ""}, + "episodes": {}, + } + + +async def _get_jellyfin_series_info(ch: Channel, ji: JellyfinItem, cfg: JellyfinConfig) -> dict: + """Build get_series_info response from Jellyfin seasons/episodes.""" + from ..core.jellyfin_client import JellyfinClient as _JClient + client = _JClient(cfg.url, cfg.api_key) + episodes_by_season: dict[str, list[dict]] = {} + try: + seasons = await client.get_seasons(ji.jellyfin_item_id) + for season in seasons: + season_id = season.get("Id", "") + season_num = str(season.get("IndexNumber", 1)) + eps = await client.get_episodes(ji.jellyfin_item_id, season_id) + ep_list = [] + for ep_num, ep in enumerate(eps, 1): + ep_jf_id = ep.get("Id", "") + if not ep_jf_id: + continue + # Stable numeric ID derived from the Jellyfin episode ID + fake_id = abs(hash(ep_jf_id)) % (10 ** 9) + stream_url = client.build_stream_url(ep_jf_id) + _jellyfin_episode_cache[str(fake_id)] = stream_url + ep_list.append({ + "id": fake_id, + "episode_num": ep.get("IndexNumber", ep_num), + "title": ep.get("Name", f"Episodio {ep_num}"), + "container_extension": "mkv", + "info": { + "plot": ep.get("Overview", ""), + "duration_secs": 0, + "rating": "", + "name": ep.get("Name", ""), + "air_date": "", + }, + }) + if ep_list: + episodes_by_season[season_num] = ep_list + except Exception as e: + logger.warning(f"Jellyfin seasons fetch failed for {ji.jellyfin_item_id}: {e}") + + return { + "info": { + "name": ch.name, + "cover": ch.tvg_logo or "", + "plot": ji.plot or "", + "cast": "", + "director": "", + "genre": ji.genres or "", + "release_date": str(ji.year) if ji.year else "", + "rating": ji.rating or "", + "backdrop_path": ch.tvg_logo or "", + "youtube_trailer": "", + "episode_run_time": "", + }, + "episodes": episodes_by_season, + } + + +async def _get_vod_info(vod_id: str, user: User, db: AsyncSession) -> dict: + result = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.stream_id_at_provider == vod_id, Channel.type == ContentType.movie) + ) + ch = result.scalar_one_or_none() + # Fallback: Jellyfin movies return ch.id as vod_id (non-numeric stream_id_at_provider) + if not ch: + try: + ch_id = int(vod_id) + fb = await db.execute( + select(Channel) + .options(selectinload(Channel.provider_maps)) + .where(Channel.id == ch_id, Channel.type == ContentType.movie) + ) + ch = fb.scalar_one_or_none() + except (ValueError, TypeError): + pass + if not ch: + return {"info": {}, "movie_data": {}} + # If this is a Jellyfin movie, return its metadata from JellyfinItem + ji_result = await db.execute(select(JellyfinItem).where(JellyfinItem.channel_id == ch.id)) + ji = ji_result.scalar_one_or_none() + if ji: + return { + "info": { + "name": ch.name, + "cover": ch.tvg_logo or "", + "plot": ji.plot or "", + "cast": "", + "director": "", + "genre": ji.genres or "", + "release_date": str(ji.year) if ji.year else "", + "rating": ji.rating or "", + "duration_secs": 0, + "backdrop_path": ch.tvg_logo or "", + "youtube_trailer": "", + "tmdb_id": "", + }, + "movie_data": { + "stream_id": str(ch.id), + "name": ch.name, + "added": "0", + "category_id": str(ch.category_id) if ch.category_id else "0", + "container_extension": "mkv", + "custom_sid": "", + "direct_source": "", + }, + } + if ch.provider_maps: + pmap = ch.provider_maps[0] + prov_result = await db.execute(select(ProviderAccount).where(ProviderAccount.id == pmap.provider_account_id)) + provider = prov_result.scalar_one_or_none() + if provider: + client = XtreamClient(provider.base_url, provider.username, provider.password) + try: + return await client.get_vod_info(vod_id) + except Exception as e: + logger.warning(f"VOD info fetch failed for vod_id={vod_id}: {e}") + return { + "info": {"name": ch.name, "cover": ch.tvg_logo or "", "plot": "", "cast": "", "director": "", "genre": "", "release_date": "", "rating": ""}, + "movie_data": {"stream_id": ch.stream_id_at_provider, "container_extension": "mkv"}, + } diff --git a/backend/config.py b/backend/config.py new file mode 100644 index 0000000..d27f70f --- /dev/null +++ b/backend/config.py @@ -0,0 +1,34 @@ +from pydantic_settings import BaseSettings +from functools import lru_cache + + +class Settings(BaseSettings): + database_url: str = "postgresql+asyncpg://kirastream:kirastream_secret_2024@localhost/kirastream" + redis_url: str = "redis://localhost:6379/0" + secret_key: str = "kirastream-super-secret-change-in-production-2024" + algorithm: str = "HS256" + access_token_expire_minutes: int = 60 * 24 * 7 # 7 days + + admin_username: str = "admin" + admin_password: str = "kiraadmin" + + stream_chunk_size: int = 65536 # 64 KB chunks + stream_queue_maxsize: int = 512 + stream_connect_timeout: int = 10 + stream_read_timeout: int = 30 + + epg_refresh_hours: int = 12 + m3u_cache_minutes: int = 30 + + log_level: str = "INFO" + + class Config: + env_file = "/opt/kirastream/.env" + + +@lru_cache +def get_settings() -> Settings: + return Settings() + + +settings = get_settings() diff --git a/backend/core/__init__.py b/backend/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/backend/core/catalog.py b/backend/core/catalog.py new file mode 100644 index 0000000..bc6aad3 --- /dev/null +++ b/backend/core/catalog.py @@ -0,0 +1,78 @@ +"""Resolve channel catalog for a given user based on their assigned categories.""" +from sqlalchemy import select +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy.orm import selectinload + +from ..models.user import User, UserCatalogEntry, UserProviderPreference +from ..models.channel import Channel, Category, ChannelProviderMap, ContentType +from ..models.provider import ProviderAccount + + +async def get_user_categories(db: AsyncSession, user: User, content_type: ContentType | None = None) -> list[Category]: + q = ( + select(Category) + .join(UserCatalogEntry, UserCatalogEntry.category_id == Category.id) + .where(UserCatalogEntry.user_id == user.id) + ) + if content_type: + q = q.where(Category.type == content_type) + result = await db.execute(q) + return list(result.scalars().all()) + + +async def get_user_channels( + db: AsyncSession, + user: User, + content_type: ContentType | None = None, + category_id: int | None = None, +) -> list[Channel]: + category_ids_q = ( + select(UserCatalogEntry.category_id) + .where(UserCatalogEntry.user_id == user.id) + ) + + q = ( + select(Channel) + .options(selectinload(Channel.provider_maps), selectinload(Channel.category)) + .where(Channel.category_id.in_(category_ids_q)) + .where(Channel.is_active == True) # noqa: E712 + ) + if content_type: + q = q.where(Channel.type == content_type) + if category_id: + q = q.where(Channel.category_id == category_id) + + result = await db.execute(q) + return list(result.scalars().all()) + + +async def get_channel_provider_maps(db: AsyncSession, channel_id: int) -> list[dict]: + q = ( + select(ChannelProviderMap, ProviderAccount.name.label("provider_name")) + .join(ProviderAccount, ProviderAccount.id == ChannelProviderMap.provider_account_id) + .where(ChannelProviderMap.channel_id == channel_id) + ) + result = await db.execute(q) + rows = result.all() + return [ + { + "provider_account_id": row.ChannelProviderMap.provider_account_id, + "stream_url": row.ChannelProviderMap.stream_url, + "provider_name": row.provider_name or f"#{row.ChannelProviderMap.provider_account_id}", + } + for row in rows + ] + + +async def can_user_access_channel(db: AsyncSession, user: User, channel_id: int) -> bool: + channels = await get_user_channels(db, user) + return any(ch.id == channel_id for ch in channels) + + +async def get_user_preferred_provider_ids(db: AsyncSession, user: User) -> list[int]: + result = await db.execute( + select(UserProviderPreference.provider_account_id) + .where(UserProviderPreference.user_id == user.id) + .order_by(UserProviderPreference.priority) + ) + return list(result.scalars().all()) diff --git a/backend/core/epg_manager.py b/backend/core/epg_manager.py new file mode 100644 index 0000000..fa68e0d --- /dev/null +++ b/backend/core/epg_manager.py @@ -0,0 +1,99 @@ +"""EPG manager: fetch XMLTV sources, merge by tvg-id, serve filtered by user catalog.""" +import asyncio +import gzip +import logging +import time +from datetime import datetime, timezone +from io import BytesIO +from lxml import etree +import aiohttp +from sqlalchemy.ext.asyncio import AsyncSession +from sqlalchemy import select + +from ..models.epg import EpgSource +from ..config import settings + +logger = logging.getLogger(__name__) + +_merged_epg: bytes = b"" +_last_update: float = 0.0 +_update_lock = asyncio.Lock() + + +async def refresh_epg(db: AsyncSession) -> None: + global _merged_epg, _last_update + async with _update_lock: + result = await db.execute(select(EpgSource).where(EpgSource.is_active == True)) # noqa: E712 + sources = result.scalars().all() + if not sources: + logger.info("No active EPG sources configured") + return + + root = etree.Element("tv") + timeout = aiohttp.ClientTimeout(total=60) + + async with aiohttp.ClientSession(timeout=timeout) as session: + for source in sources: + try: + data = await _fetch_xmltv(session, source.url) + tree = etree.fromstring(data) + for elem in tree: + root.append(elem) + logger.info(f"EPG loaded from {source.name}: {len(tree)} entries") + except Exception as e: + logger.error(f"EPG fetch failed for {source.name}: {e}") + + _merged_epg = etree.tostring(root, xml_declaration=True, encoding="UTF-8") + _last_update = time.time() + + from sqlalchemy import update + await db.execute( + update(EpgSource).where(EpgSource.is_active == True).values(last_fetched_at=datetime.now(timezone.utc)) # noqa: E712 + ) + await db.commit() + logger.info(f"EPG merge complete, {len(_merged_epg)} bytes") + + +async def _fetch_xmltv(session: aiohttp.ClientSession, url: str) -> bytes: + async with session.get(url, ssl=False) as resp: + resp.raise_for_status() + data = await resp.read() + if data[:2] == b"\x1f\x8b": + data = gzip.decompress(data) + return data + + +def get_merged_epg() -> bytes: + return _merged_epg + + +def filter_epg_for_channels(tvg_ids: set[str]) -> bytes: + """Return EPG XML filtered to only contain channels/programs for given tvg-ids.""" + if not _merged_epg: + return b'' + try: + tree = etree.fromstring(_merged_epg) + root = etree.Element("tv") + for elem in tree: + tag = elem.tag + if tag == "channel": + if elem.get("id") in tvg_ids: + root.append(elem) + elif tag == "programme": + if elem.get("channel") in tvg_ids: + root.append(elem) + return etree.tostring(root, xml_declaration=True, encoding="UTF-8") + except Exception as e: + logger.error(f"EPG filter error: {e}") + return _merged_epg + + +async def epg_background_task(get_db_func) -> None: + """Periodic EPG refresh task — runs every N hours.""" + while True: + try: + async for db in get_db_func(): + await refresh_epg(db) + except Exception as e: + logger.error(f"EPG background refresh error: {e}") + await asyncio.sleep(settings.epg_refresh_hours * 3600) diff --git a/backend/core/health_checker.py b/backend/core/health_checker.py new file mode 100644 index 0000000..66ec71b --- /dev/null +++ b/backend/core/health_checker.py @@ -0,0 +1,115 @@ +"""Background health checker for provider URLs.""" +import asyncio +import logging +import time +from datetime import datetime, timezone + +import aiohttp +from sqlalchemy import select + +from ..database import AsyncSessionLocal +from ..models.provider import ProviderAccount, ProviderUrl + +logger = logging.getLogger(__name__) + +CHECK_INTERVAL = 300 # 5 minutes + + +async def _check_url(base_url: str, username: str, password: str) -> tuple[str, int | None]: + url = f"{base_url.rstrip('/')}/player_api.php" + params = {"username": username, "password": password, "action": "user_info"} + start = time.time() + try: + timeout = aiohttp.ClientTimeout(total=8) + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.get(url, params=params, ssl=False) as resp: + elapsed_ms = int((time.time() - start) * 1000) + if resp.status == 200: + try: + data = await resp.json(content_type=None) + if "user_info" in data: + return "ok", elapsed_ms + except Exception: + pass + return "error", elapsed_ms + except asyncio.TimeoutError: + return "timeout", None + except Exception: + return "error", None + + +async def check_provider_urls(provider_account_id: int) -> list[dict]: + """Check all URLs for a specific provider. Returns list of result dicts.""" + async with AsyncSessionLocal() as db: + result = await db.execute( + select(ProviderUrl.id, ProviderUrl.url, ProviderAccount.username, ProviderAccount.password) + .join(ProviderAccount) + .where( + ProviderUrl.provider_account_id == provider_account_id, + ProviderUrl.is_active == True, # noqa: E712 + ) + ) + rows = result.all() + + if not rows: + return [] + + tasks = [_check_url(url, username, password) for _, url, username, password in rows] + results = await asyncio.gather(*tasks, return_exceptions=True) + + now = datetime.now(timezone.utc) + output = [] + async with AsyncSessionLocal() as db: + for (url_id, url, _, _), check_result in zip(rows, results): + if isinstance(check_result, Exception): + status, response_ms = "error", None + else: + status, response_ms = check_result + pu = await db.get(ProviderUrl, url_id) + if pu: + pu.status = status + pu.response_ms = response_ms + pu.last_checked_at = now + output.append({"id": url_id, "url": url, "status": status, "response_ms": response_ms}) + await db.commit() + + return output + + +async def health_check_loop() -> None: + """Runs forever, checking all active provider URLs every CHECK_INTERVAL seconds.""" + logger.info("Provider URL health checker started") + while True: + await asyncio.sleep(CHECK_INTERVAL) + try: + async with AsyncSessionLocal() as db: + result = await db.execute( + select(ProviderUrl.id, ProviderUrl.url, ProviderAccount.username, ProviderAccount.password) + .join(ProviderAccount) + .where(ProviderUrl.is_active == True) # noqa: E712 + ) + rows = result.all() + + if not rows: + continue + + tasks = [_check_url(url, username, password) for _, url, username, password in rows] + check_results = await asyncio.gather(*tasks, return_exceptions=True) + + now = datetime.now(timezone.utc) + async with AsyncSessionLocal() as db: + for (url_id, _, _, _), check_result in zip(rows, check_results): + if isinstance(check_result, Exception): + status, response_ms = "error", None + else: + status, response_ms = check_result + pu = await db.get(ProviderUrl, url_id) + if pu: + pu.status = status + pu.response_ms = response_ms + pu.last_checked_at = now + await db.commit() + + logger.info(f"Health check done: {len(rows)} URLs checked") + except Exception as e: + logger.error(f"Health check loop error: {e}") diff --git a/backend/core/jellyfin_client.py b/backend/core/jellyfin_client.py new file mode 100644 index 0000000..59eb278 --- /dev/null +++ b/backend/core/jellyfin_client.py @@ -0,0 +1,120 @@ +"""Async Jellyfin API client — discovery, libraries, items, streaming.""" +import logging + +import aiohttp + +logger = logging.getLogger(__name__) + +_SHORT = aiohttp.ClientTimeout(total=10) +_MEDIUM = aiohttp.ClientTimeout(total=30) +_LONG = aiohttp.ClientTimeout(total=60) + + +class JellyfinClient: + def __init__(self, url: str, api_key: str): + self.url = url.rstrip("/") + self.api_key = api_key + + @property + def _headers(self) -> dict: + return {"X-Emby-Token": self.api_key, "Accept": "application/json"} + + # ------------------------------------------------------------------ + # Discovery + # ------------------------------------------------------------------ + + async def test_connection(self) -> dict: + async with aiohttp.ClientSession() as s: + async with s.get( + f"{self.url}/System/Info/Public", timeout=_SHORT + ) as r: + r.raise_for_status() + return await r.json() + + async def get_libraries(self) -> list[dict]: + async with aiohttp.ClientSession() as s: + async with s.get( + f"{self.url}/Library/VirtualFolders", + headers=self._headers, + timeout=_SHORT, + ) as r: + r.raise_for_status() + data = await r.json() + return data if isinstance(data, list) else [] + + # ------------------------------------------------------------------ + # Items (movies / series) + # ------------------------------------------------------------------ + + async def get_items(self, library_id: str, item_type: str) -> list[dict]: + """Fetch all items of a given type from one library (paginated).""" + all_items: list[dict] = [] + start = 0 + limit = 200 + while True: + params = { + "ParentId": library_id, + "IncludeItemTypes": item_type, + "Recursive": "true", + "Fields": "Overview,Genres,OfficialRating,ProductionYear", + "Limit": str(limit), + "StartIndex": str(start), + } + async with aiohttp.ClientSession() as s: + async with s.get( + f"{self.url}/Items", + params=params, + headers=self._headers, + timeout=_LONG, + ) as r: + r.raise_for_status() + data = await r.json() + batch = data.get("Items", []) + all_items.extend(batch) + total = data.get("TotalRecordCount", 0) + if len(all_items) >= total or not batch: + break + start += len(batch) + return all_items + + # ------------------------------------------------------------------ + # Series structure (seasons + episodes) + # ------------------------------------------------------------------ + + async def get_seasons(self, series_id: str) -> list[dict]: + async with aiohttp.ClientSession() as s: + async with s.get( + f"{self.url}/Shows/{series_id}/Seasons", + params={"Fields": "Overview"}, + headers=self._headers, + timeout=_MEDIUM, + ) as r: + r.raise_for_status() + return (await r.json()).get("Items", []) + + async def get_episodes(self, series_id: str, season_id: str) -> list[dict]: + async with aiohttp.ClientSession() as s: + async with s.get( + f"{self.url}/Shows/{series_id}/Episodes", + params={"SeasonId": season_id, "Fields": "Overview"}, + headers=self._headers, + timeout=_MEDIUM, + ) as r: + r.raise_for_status() + return (await r.json()).get("Items", []) + + # ------------------------------------------------------------------ + # URL builders + # ------------------------------------------------------------------ + + def build_stream_url(self, item_id: str) -> str: + return ( + f"{self.url}/Videos/{item_id}/stream" + f"?static=true&api_key={self.api_key}&Container=mkv" + ) + + def build_image_url(self, item_id: str, max_width: int = 400) -> str: + return ( + f"{self.url}/Items/{item_id}/Images/Primary" + f"?api_key={self.api_key}&MaxWidth={max_width}" + ) diff --git a/backend/core/pool.py b/backend/core/pool.py new file mode 100644 index 0000000..54909f1 --- /dev/null +++ b/backend/core/pool.py @@ -0,0 +1,314 @@ +"""ProviderPool: manages provider account slots and live stream allocation.""" +import asyncio +import json +import logging +import time +from typing import AsyncIterator + +import redis.asyncio as aioredis + +from ..config import settings +from .restream import BroadcastGroup, ClientHandle + +logger = logging.getLogger(__name__) + +ACTIVE_STREAM_KEY = "ks:stream:{channel_id}" +PROVIDER_SLOT_KEY = "ks:slot:{account_id}" +USER_CONN_KEY = "ks:user_conns:{user_id}" +MONITORING_KEY = "ks:monitoring" + + +class NoSlotsAvailableError(Exception): + pass + + +class MaxConnectionsExceededError(Exception): + pass + + +class ProviderPool: + """ + Singleton managing all active BroadcastGroups and provider slot allocation. + Uses Redis for cross-process state and in-memory dict for the asyncio objects. + """ + + def __init__(self): + self._groups: dict[int, BroadcastGroup] = {} + self._lock = asyncio.Lock() + self._redis: aioredis.Redis | None = None + + async def init(self) -> None: + self._redis = aioredis.from_url(settings.redis_url, decode_responses=True) + await self._redis.ping() + # Clear any stale keys left from a previous process crash or restart + stale = await self._redis.keys("ks:*") + if stale: + await self._redis.delete(*stale) + logger.info(f"ProviderPool cleared {len(stale)} stale Redis keys on startup") + logger.info("ProviderPool initialized, Redis connected") + + async def close(self) -> None: + if self._redis: + await self._redis.aclose() + + # ------------------------------------------------------------------------- + # Public interface + # ------------------------------------------------------------------------- + + async def acquire( + self, + channel_id: int, + stream_url_resolver, # async callable(provider_account_id) -> str + provider_maps: list[dict], # [{"provider_account_id": X, "stream_url": Y, "provider_name": Z}, ...] + user_id: str, + user_max_conns: int, + is_priority: bool = False, + preferred_provider_ids: list[int] | None = None, + username: str = "", + channel_name: str = "", + ) -> ClientHandle: + await self._check_user_connections(user_id, user_max_conns) + + async with self._lock: + # Case 1: stream already active → attach to existing group + if channel_id in self._groups: + group = self._groups[channel_id] + handle = await group.add_client(user_id, username=username, is_priority=is_priority) + await self._redis.hincrby(ACTIVE_STREAM_KEY.format(channel_id=channel_id), "clients", 1) + await self._redis.sadd(USER_CONN_KEY.format(user_id=user_id), handle.client_id) + await self._publish_monitoring() + logger.info(f"User {user_id} attached to existing stream ch={channel_id}") + return handle + + # Case 2: find a free slot (preferred providers sorted first) + sorted_maps = self._sort_by_preference(provider_maps, preferred_provider_ids) + account_id, stream_url = await self._find_free_slot(sorted_maps) + + if account_id is None: + if not is_priority: + raise NoSlotsAvailableError(f"No free provider slots for channel {channel_id}") + + # Case 3: priority eviction — bump a non-priority stream + account_id, stream_url, victim_group = await self._find_eviction_candidate(sorted_maps) + if account_id is None: + raise NoSlotsAvailableError(f"No evictable non-priority streams for channel {channel_id}") + + # Clean Redis for the victim stream inside the lock + victim_channel_id = victim_group.channel_id + victim_account_id = victim_group.provider_account_id + self._groups.pop(victim_channel_id, None) + await self._redis.delete(ACTIVE_STREAM_KEY.format(channel_id=victim_channel_id)) + await self._redis.delete(PROVIDER_SLOT_KEY.format(account_id=victim_account_id)) + # Stop victim group outside lock (disconnect all its clients via SENTINEL) + asyncio.create_task(victim_group.stop()) + logger.info( + f"Priority eviction: stopped ch={victim_channel_id} " + f"(provider_account={victim_account_id}) for priority user {user_id}" + ) + + # Reserve slot + await self._redis.set(PROVIDER_SLOT_KEY.format(account_id=account_id), channel_id) + + provider_name = next( + (pm.get("provider_name", "") for pm in provider_maps if pm["provider_account_id"] == account_id), "" + ) + stream_urls = await self._build_stream_urls(account_id, stream_url) + group = BroadcastGroup( + channel_id=channel_id, + stream_urls=stream_urls, + provider_account_id=account_id, + channel_name=channel_name, + provider_name=provider_name, + ) + self._groups[channel_id] = group + handle = await group.add_client(user_id, username=username, is_priority=is_priority) + + await self._redis.hset( + ACTIVE_STREAM_KEY.format(channel_id=channel_id), + mapping={ + "provider_account_id": account_id, + "stream_url": stream_url, + "clients": 1, + "started_at": time.time(), + }, + ) + await self._redis.sadd(USER_CONN_KEY.format(user_id=user_id), handle.client_id) + await group.start() + await self._publish_monitoring() + logger.info(f"New stream started ch={channel_id} provider_account={account_id}") + return handle + + async def release(self, channel_id: int, client_id: str, user_id: str) -> None: + group_to_stop: BroadcastGroup | None = None + stopped_account_id: int | None = None + + async with self._lock: + group = self._groups.get(channel_id) + if not group: + return + + remaining = await group.remove_client(client_id) + await self._redis.srem(USER_CONN_KEY.format(user_id=user_id), client_id) + + if remaining == 0: + # Remove from registry and clean Redis *while holding the lock*, + # but defer group.stop() (which awaits task cancellation) until + # after the lock is released to avoid blocking the pool. + self._groups.pop(channel_id, None) + group_to_stop = group + stopped_account_id = group.provider_account_id + await self._redis.delete(ACTIVE_STREAM_KEY.format(channel_id=channel_id)) + await self._redis.delete(PROVIDER_SLOT_KEY.format(account_id=stopped_account_id)) + else: + await self._redis.hset( + ACTIVE_STREAM_KEY.format(channel_id=channel_id), "clients", remaining + ) + + await self._publish_monitoring() + + if group_to_stop is not None: + await group_to_stop.stop() + logger.info(f"Stream stopped ch={channel_id}, slot freed: provider_account={stopped_account_id}") + + async def kill_client(self, client_id: str) -> bool: + """Admin: force-disconnect a specific client by sending SENTINEL to their queue.""" + async with self._lock: + for group in self._groups.values(): + if client_id in group._clients: + return await group.force_disconnect_client(client_id) + return False + + def get_active_streams(self) -> list[dict]: + return [g.stats() for g in self._groups.values()] + + async def get_user_connection_count(self, user_id: str) -> int: + return await self._redis.scard(USER_CONN_KEY.format(user_id=user_id)) + + # ------------------------------------------------------------------------- + # Internal helpers + # ------------------------------------------------------------------------- + + async def _check_user_connections(self, user_id: str, max_conns: int) -> None: + # Cross-check Redis set against in-memory groups to auto-heal stale entries + redis_conns = await self._redis.smembers(USER_CONN_KEY.format(user_id=user_id)) + if redis_conns: + active = {cid for g in self._groups.values() for cid in g.client_ids} + stale = redis_conns - active + if stale: + await self._redis.srem(USER_CONN_KEY.format(user_id=user_id), *stale) + logger.warning(f"Auto-cleaned {len(stale)} stale conn(s) for user {user_id}") + redis_conns -= stale + count = len(redis_conns) + if count >= max_conns: + # Determine if this is a zapping scenario (same device switching channels quickly) + # or a genuine multi-device connection attempt. + # Zapping: the existing connection is very recent (< 10 s) — the TV app opens the + # new stream before the HTTP response of the old one closes. In that case we evict + # silently so the channel switch is seamless. + # Multi-device: the existing connection is older — keep it alive and raise so the + # caller can show a "blocked" stream on the new device instead. + now = time.time() + groups_snapshot = list(self._groups.values()) + oldest_age = 0.0 + for group in groups_snapshot: + for cid, handle in group._clients.items(): + if cid in redis_conns: + oldest_age = max(oldest_age, now - handle.connected_at) + + if oldest_age < 10.0: + # Zapping — evict silently + logger.info(f"User {user_id} zapping ({oldest_age:.1f}s old conn) — evicting old stream") + for client_id in list(redis_conns): + for group in groups_snapshot: + if client_id in group._clients: + await group.force_disconnect_client(client_id) + break + await self._redis.srem(USER_CONN_KEY.format(user_id=user_id), client_id) + else: + # Multi-device — reject so caller can show blocked image + raise MaxConnectionsExceededError( + f"User {user_id} already has {count}/{max_conns} connections" + ) + + def _sort_by_preference( + self, provider_maps: list[dict], preferred_ids: list[int] | None + ) -> list[dict]: + if not preferred_ids: + return provider_maps + pref_set = set(preferred_ids) + preferred = [pm for pm in provider_maps if pm["provider_account_id"] in pref_set] + rest = [pm for pm in provider_maps if pm["provider_account_id"] not in pref_set] + return preferred + rest + + async def _build_stream_urls(self, account_id: int, primary_stream_url: str) -> list[str]: + """Build list of stream URLs for failover: one per active ProviderUrl, substituting base URL.""" + from urllib.parse import urlparse, urlunparse + from ..models.provider import ProviderUrl + from ..database import AsyncSessionLocal + from sqlalchemy import select + + parsed = urlparse(primary_stream_url) + + async with AsyncSessionLocal() as db: + result = await db.execute( + select(ProviderUrl) + .where( + ProviderUrl.provider_account_id == account_id, + ProviderUrl.is_active == True, # noqa: E712 + ) + .order_by(ProviderUrl.priority) + ) + provider_urls = result.scalars().all() + + if not provider_urls: + return [primary_stream_url] + + urls = [] + for pu in provider_urls: + alt = urlparse(pu.url.rstrip('/')) + reconstructed = urlunparse(( + alt.scheme or parsed.scheme, + alt.netloc, + parsed.path, + parsed.params, + parsed.query, + parsed.fragment, + )) + urls.append(reconstructed) + return urls + + async def _find_free_slot(self, provider_maps: list[dict]) -> tuple[int | None, str | None]: + for pm in provider_maps: + account_id = pm["provider_account_id"] + slot_key = PROVIDER_SLOT_KEY.format(account_id=account_id) + busy = await self._redis.exists(slot_key) + if not busy: + return account_id, pm["stream_url"] + return None, None + + async def _find_eviction_candidate( + self, provider_maps: list[dict] + ) -> tuple[int | None, str | None, BroadcastGroup | None]: + """Find a stream with only non-priority clients that uses a slot we need.""" + available = {pm["provider_account_id"]: pm["stream_url"] for pm in provider_maps} + + candidate: BroadcastGroup | None = None + for group in self._groups.values(): + if group.provider_account_id in available and group.all_non_priority: + if candidate is None or group.client_count < candidate.client_count: + candidate = group + + if candidate is None: + return None, None, None + + return candidate.provider_account_id, available[candidate.provider_account_id], candidate + + async def _publish_monitoring(self) -> None: + try: + data = json.dumps([g.stats() for g in self._groups.values()]) + await self._redis.publish(MONITORING_KEY, data) + except Exception: + pass + + +pool = ProviderPool() diff --git a/backend/core/probe.py b/backend/core/probe.py new file mode 100644 index 0000000..6976e76 --- /dev/null +++ b/backend/core/probe.py @@ -0,0 +1,112 @@ +"""FFprobe-based stream metadata — resolution, FPS, codecs, bitrate.""" +import asyncio +import json +import logging +import time + +logger = logging.getLogger(__name__) + +# Simple in-process cache: url → (info_dict, fetched_at) +_cache: dict[str, tuple[dict, float]] = {} +_CACHE_TTL = 3600 # 1 hour — re-probe if URL expires or stream restarts + +# Locks per URL to avoid parallel probes for the same stream +_locks: dict[str, asyncio.Lock] = {} + + +async def probe_stream(url: str) -> dict: + """ + Run ffprobe against *url* and return a dict with video/audio metadata. + Returns {} on failure (non-fatal — the stream still works). + Results are cached for CACHE_TTL seconds. + """ + now = time.time() + cached = _cache.get(url) + if cached and now - cached[1] < _CACHE_TTL: + return cached[0] + + if url not in _locks: + _locks[url] = asyncio.Lock() + + async with _locks[url]: + # Re-check after acquiring lock (another task may have already probed) + cached = _cache.get(url) + if cached and now - cached[1] < _CACHE_TTL: + return cached[0] + + info = await _run_ffprobe(url) + _cache[url] = (info, time.time()) + return info + + +async def _run_ffprobe(url: str) -> dict: + try: + proc = await asyncio.create_subprocess_exec( + "ffprobe", + "-v", "quiet", + "-print_format", "json", + "-show_streams", + "-show_format", + "-analyzeduration", "3000000", # 3 s — fast enough for live streams + "-probesize", "1000000", # 1 MB + url, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.DEVNULL, + ) + try: + stdout, _ = await asyncio.wait_for(proc.communicate(), timeout=20) + except asyncio.TimeoutError: + try: + proc.kill() + except ProcessLookupError: + pass + logger.debug(f"ffprobe timed out for {url}") + return {} + + data = json.loads(stdout) + except Exception as e: + logger.debug(f"ffprobe failed for {url}: {e}") + return {} + + info: dict = {} + + for stream in data.get("streams", []): + ctype = stream.get("codec_type", "") + if ctype == "video" and "video_codec" not in info: + info["video_codec"] = stream.get("codec_name", "") + info["video_profile"] = stream.get("profile", "") + info["width"] = stream.get("width", 0) + info["height"] = stream.get("height", 0) + # FPS: prefer avg_frame_rate, fallback r_frame_rate + for fps_field in ("avg_frame_rate", "r_frame_rate"): + fps_str = stream.get(fps_field, "") + if fps_str and "/" in fps_str: + try: + num, den = fps_str.split("/") + fps = round(int(num) / int(den), 3) if int(den) else 0 + if 1 < fps < 200: # sanity check + info["fps"] = round(fps, 2) + break + except (ValueError, ZeroDivisionError): + pass + + elif ctype == "audio" and "audio_codec" not in info: + info["audio_codec"] = stream.get("codec_name", "") + info["audio_channels"] = stream.get("channels", 0) + info["audio_sample_rate"] = int(stream.get("sample_rate", 0) or 0) + + fmt = data.get("format", {}) + try: + br = int(fmt.get("bit_rate", 0) or 0) + if br > 0: + info["bitrate_bps"] = br + except (ValueError, TypeError): + pass + + logger.debug(f"Probed {url}: {info}") + return info + + +def invalidate(url: str) -> None: + """Evict a URL from the cache (call when stream URL changes).""" + _cache.pop(url, None) diff --git a/backend/core/restream.py b/backend/core/restream.py new file mode 100644 index 0000000..d2ca9d3 --- /dev/null +++ b/backend/core/restream.py @@ -0,0 +1,610 @@ +"""BroadcastGroup: fan-out a single provider stream to N simultaneous clients. + +Recovery model +-------------- +The pump loop runs indefinitely while self._running is True. Each iteration +spawns an ffmpeg process in copy (remux) mode. ffmpeg owns the upstream +HTTP connection. When the provider closes the session (typically every +~2 minutes) ffmpeg exits and the outer loop spawns a fresh process — the +provider delivers from the current live edge so timestamps are always +forward-moving and the player never sees a backward seek (rewind). + +If ffmpeg itself exits (unrecoverable error or stall beyond its own timeout) +the outer loop drains all client queues, backs off briefly, and spawns a +fresh ffmpeg process — again without disconnecting clients. + +SENTINEL is only pushed when stop() is called or the pump truly gives up. + +Stall detection +--------------- +ffmpeg's -timeout option (socket-level read timeout) handles provider stalls. +A safety-net asyncio.wait_for wraps each stdout read in case ffmpeg hangs +without producing output or exiting. + +A/V sync +-------- +ffmpeg re-muxes the incoming MPEG-TS into a fresh output stream. On every +reconnect the output PTS/DTS sequence is continuous regardless of provider- +side timestamp resets, eliminating audio desync entirely. No video or audio +is re-encoded — quality is bit-for-bit identical to the source. +""" +import asyncio +import logging +import os +import shutil +import time +import uuid +from dataclasses import dataclass, field +from typing import AsyncIterator + +from ..config import settings + +logger = logging.getLogger(__name__) + +CHUNK_SIZE = settings.stream_chunk_size +QUEUE_MAX = settings.stream_queue_maxsize +STALL_TIMEOUT = 10.0 # seconds — passed to ffmpeg -timeout (in µs below) +MAX_RETRIES = 999 # effectively infinite; pool stops the group when 0 clients +_BACKOFF_CAP = 5.0 # max seconds between outer retries + +_SENTINEL = object() # signals end-of-stream to client queues + +_FFMPEG = shutil.which("ffmpeg") or "ffmpeg" + +# ffmpeg stderr patterns that indicate input-side A/V issues (demuxer warnings). +# These don't affect output quality with -use_wallclock_as_timestamps but are +# counted as a health metric to surface in the dashboard. +_AV_WARN_PATTERNS = ( + "timestamp discontinuity", + "Packet corrupt", + "PES packet size mismatch", + "DTS, out of order", +) + +# Health check: data-age thresholds +_HEALTH_WARN_SECS = 12.0 # > 12 s without data → warning (normal reconnects are 1-4 s) +_HEALTH_ERROR_SECS = 25.0 # > 25 s → error, trigger correction + + +def _url_netloc(url: str) -> str: + from urllib.parse import urlparse + try: + return urlparse(url).netloc + except Exception: + return url + + +@dataclass +class ClientHandle: + client_id: str + queue: asyncio.Queue = field(default_factory=lambda: asyncio.Queue(maxsize=QUEUE_MAX)) + connected_at: float = field(default_factory=time.time) + is_priority: bool = False + username: str = "" + _overflow_count: int = 0 + _overflow_since: float | None = None + + async def read(self) -> AsyncIterator[bytes]: + while True: + chunk = await self.queue.get() + if chunk is _SENTINEL: + break + yield chunk + + +class BroadcastGroup: + """Streams one provider URL and distributes chunks to all registered clients.""" + + def __init__( + self, + channel_id: int, + stream_urls: list[str], + provider_account_id: int, + channel_name: str = "", + provider_name: str = "", + # kept for backward compat in callers that still pass stream_url as kwarg + stream_url: str | None = None, + ): + self.channel_id = channel_id + self.channel_name = channel_name + # Support old callers that pass a single stream_url + if stream_urls: + self._stream_urls = stream_urls + elif stream_url: + self._stream_urls = [stream_url] + else: + self._stream_urls = [] + self.stream_url = self._stream_urls[0] if self._stream_urls else "" + self._active_url: str = self.stream_url + self.provider_account_id = provider_account_id + self.provider_name = provider_name + self.started_at = time.time() + + self._clients: dict[str, ClientHandle] = {} + self._lock = asyncio.Lock() + self._task: asyncio.Task | None = None + self._running = False + + # Throughput tracking + self._bytes_pumped: int = 0 + self._bytes_prev: int = 0 + self._bps_time: float = time.time() + self._bps_down: float = 0.0 + + # Health / metadata + self.stream_info: dict = {} + self._reconnect_count: int = 0 + self._status: str = "connecting" + self._last_data_at: float = time.time() + + # ffmpeg process tracking + self._ffmpeg_pid: int | None = None + self._ffmpeg_start_time: float | None = None # wall time when ffmpeg started + self._ffmpeg_cpu: float = 0.0 + self._cpu_task: asyncio.Task | None = None + + # A/V health tracking + self._av_health: str = "ok" # ok / warning / error + self._av_desync_count: int = 0 # cumulative stderr A/V-warning events + self._corrections: int = 0 # how many times health monitor killed stuck ffmpeg + self._health_task: asyncio.Task | None = None + + # ------------------------------------------------------------------ + # Public API + # ------------------------------------------------------------------ + + @property + def client_count(self) -> int: + return len(self._clients) + + @property + def client_ids(self) -> list[str]: + return list(self._clients.keys()) + + @property + def all_non_priority(self) -> bool: + return all(not h.is_priority for h in self._clients.values()) + + async def start(self) -> None: + self._running = True + self._task = asyncio.create_task( + self._pump_with_retry(), name=f"pump-ch{self.channel_id}" + ) + self._cpu_task = asyncio.create_task( + self._monitor_cpu(), name=f"cpu-ch{self.channel_id}" + ) + self._health_task = asyncio.create_task( + self._health_check_loop(), name=f"health-ch{self.channel_id}" + ) + asyncio.create_task(self._probe_info(), name=f"probe-ch{self.channel_id}") + + async def add_client(self, user_id: str, username: str = "", is_priority: bool = False) -> ClientHandle: + client_id = f"{user_id}-{uuid.uuid4().hex[:8]}" + handle = ClientHandle(client_id=client_id, is_priority=is_priority, username=username) + async with self._lock: + self._clients[client_id] = handle + logger.info( + f"Client {client_id} ({username}) joined channel {self.channel_id} " + f"(total={len(self._clients)})" + ) + return handle + + async def force_disconnect_client(self, client_id: str) -> bool: + async with self._lock: + handle = self._clients.get(client_id) + if handle is None: + return False + _drain_queue(handle.queue) + try: + handle.queue.put_nowait(_SENTINEL) + except asyncio.QueueFull: + pass + return True + + async def remove_client(self, client_id: str) -> int: + async with self._lock: + self._clients.pop(client_id, None) + remaining = len(self._clients) + logger.info(f"Client {client_id} left channel {self.channel_id} (remaining={remaining})") + return remaining + + async def stop(self) -> None: + self._running = False + self._status = "stopped" + for task in (self._cpu_task, self._health_task): + if task and not task.done(): + task.cancel() + self._cpu_task = self._health_task = None + if self._task and not self._task.done(): + self._task.cancel() + try: + await self._task + except asyncio.CancelledError: + pass + async with self._lock: + for handle in self._clients.values(): + try: + handle.queue.put_nowait(_SENTINEL) + except asyncio.QueueFull: + pass + + def stats(self) -> dict: + n = self.client_count or 1 + return { + "stream_type": "live", + "channel_id": self.channel_id, + "channel_name": self.channel_name or f"Canal #{self.channel_id}", + "provider_account_id": self.provider_account_id, + "provider_name": self.provider_name, + "client_count": self.client_count, + "clients": [ + { + "client_id": h.client_id, + "username": h.username or h.client_id.rsplit("-", 1)[0], + } + for h in self._clients.values() + ], + "started_at": self.started_at, + "bytes_pumped": self._bytes_pumped, + "bps_down": self._bps_down, + "bps_up": self._bps_down * n, + "running": self._running, + "status": self._status, + "reconnect_count": self._reconnect_count, + "last_data_ago": round(time.time() - self._last_data_at, 1), + "stream_info": self.stream_info, + # ffmpeg process info + "ffmpeg_pid": self._ffmpeg_pid, + "ffmpeg_cpu_pct": round(self._ffmpeg_cpu, 2), + # multi-domain failover info + "active_url_domain": _url_netloc(self._active_url), + "url_count": len(self._stream_urls), + # A/V health + "av_health": self._av_health, + "av_desync_count": self._av_desync_count, + "corrections": self._corrections, + "buffer_pct": self._buffer_pct(), + "buffer_server_bytes": self._buffer_server_bytes(), + "buffer_server_secs": self._buffer_server_secs(), + "buffer_capacity": QUEUE_MAX * CHUNK_SIZE, + } + + # ------------------------------------------------------------------ + # Internal helpers + # ------------------------------------------------------------------ + + async def _monitor_cpu(self) -> None: + """Update self._ffmpeg_cpu every 3 s using cumulative average since start. + + Delta-based sampling fails for low-CPU processes (copy-mode ffmpeg uses + <1% CPU) because the tick delta in 2 s is 0-1 integer ticks, making the + result always 0.0%. Cumulative average ((total_cpu_ticks / clk_tck) / + elapsed_wall) gives a stable, accurate reading — the same method ps uses. + """ + clk_tck = float(os.sysconf(os.sysconf_names.get("SC_CLK_TCK", 2)) or 100) + + while self._running: + await asyncio.sleep(3) + pid = self._ffmpeg_pid + start_time = self._ffmpeg_start_time + if pid is None or start_time is None: + self._ffmpeg_cpu = 0.0 + continue + try: + with open(f"/proc/{pid}/stat") as f: + parts = f.read().split() + cpu_ticks = int(parts[13]) + int(parts[14]) # utime + stime + elapsed = time.time() - start_time + if elapsed > 0: + self._ffmpeg_cpu = cpu_ticks / clk_tck / elapsed * 100 + except (FileNotFoundError, IndexError, ValueError, OSError): + self._ffmpeg_cpu = 0.0 + + def _buffer_pct(self) -> float: + """Return queue fill % of the slowest (most backlogged) client (0–100).""" + if not self._clients: + return 0.0 + max_fill = max(h.queue.qsize() for h in self._clients.values()) + return round(max_fill / QUEUE_MAX * 100, 1) + + def _buffer_server_bytes(self) -> int: + """Bytes buffered for the least-buffered client (first to run dry on provider drop).""" + if not self._clients: + return 0 + return min(h.queue.qsize() for h in self._clients.values()) * CHUNK_SIZE + + def _buffer_server_secs(self) -> float: + """Estimated seconds of coverage at current bitrate.""" + if not self._clients or self._bps_down <= 0: + return 0.0 + return round(self._buffer_server_bytes() / self._bps_down, 1) + + async def _health_check_loop(self) -> None: + """Update _av_health every 5 s based on data-flow age. + + If ffmpeg is running but producing no output for _HEALTH_ERROR_SECS, + kill it so _pump_with_retry can restart it immediately — this is the + auto-correction the caller sees as a 'corrections' counter tick. + """ + consecutive_error = 0 + while self._running: + await asyncio.sleep(5) + if not self._running: + break + age = time.time() - self._last_data_at + if age < _HEALTH_WARN_SECS: + self._av_health = "ok" + consecutive_error = 0 + elif age < _HEALTH_ERROR_SECS: + self._av_health = "warning" + consecutive_error = 0 + else: + self._av_health = "error" + consecutive_error += 1 + # After 2 consecutive error checks (≈10 s) kill a stuck ffmpeg + # so _pump_with_retry can restart it without waiting for the + # 25-second safety-net timeout in _pump_once. + if consecutive_error >= 2 and self._ffmpeg_pid is not None: + import signal as _sig + try: + os.kill(self._ffmpeg_pid, _sig.SIGTERM) + self._corrections += 1 + logger.warning( + f"[ch{self.channel_id}] Health correction #{self._corrections}: " + f"killed stuck ffmpeg pid={self._ffmpeg_pid} " + f"(no data for {age:.1f}s)" + ) + except (ProcessLookupError, PermissionError): + pass + consecutive_error = 0 # reset so we don't spam kills + + async def _log_stream_event( + self, + event_type: str, + domain: str, + error_message: str, + attempt: int, + ) -> None: + """Persist a stream failure/recovery event to the database (fire-and-forget).""" + try: + from ..database import AsyncSessionLocal + from ..models.stream_event import StreamEvent + async with AsyncSessionLocal() as db: + ev = StreamEvent( + channel_id=self.channel_id, + channel_name=self.channel_name or f"Canal #{self.channel_id}", + provider_name=self.provider_name, + event_type=event_type, + domain=domain, + error_message=error_message[:500] if error_message else None, + attempt_number=attempt, + ) + db.add(ev) + await db.commit() + except Exception as exc: + logger.debug(f"[ch{self.channel_id}] Failed to persist stream event: {exc}") + + async def _probe_info(self) -> None: + from .probe import probe_stream + try: + info = await probe_stream(self.stream_url) + self.stream_info.update(info) + except Exception as e: + logger.debug(f"probe_info failed for ch{self.channel_id}: {e}") + + async def _pump_with_retry(self) -> None: + consecutive = 0 + base_wait = 0.5 + url_idx = 0 + n = len(self._stream_urls) or 1 + + try: + while self._running: + current_url = self._stream_urls[url_idx % n] + self._active_url = current_url + pump_start = time.time() + try: + await self._pump_once(current_url) + url_idx = 0 # reset to primary after successful pump + break + except asyncio.CancelledError: + raise + except Exception as e: + if not self._running: + break + pump_duration = time.time() - pump_start + + # Recovery detection: had failures before but this attempt ran stably + # for >30s — the stream was healthy and dropped again (e.g. provider + # session timeout). Log recovery, then treat next failure as fresh drop. + if consecutive > 1 and pump_duration > 30: + asyncio.create_task(self._log_stream_event( + "recuperado", + _url_netloc(current_url), + f"Estable {int(pump_duration)}s antes de caer de nuevo", + consecutive, + )) + consecutive = 0 # reset so next failure is logged as a fresh "caida" + + consecutive += 1 + self._reconnect_count += 1 + next_idx = (url_idx + 1) % n + cycle_done = (consecutive % n == 0) + + # Log the first drop of each failure sequence + if consecutive == 1: + asyncio.create_task(self._log_stream_event( + "caida", + _url_netloc(current_url), + str(e), + 1, + )) + + if n > 1: + logger.warning( + f"[ch{self.channel_id}] Domain {_url_netloc(current_url)} failed " + f"(attempt {consecutive}), trying {_url_netloc(self._stream_urls[next_idx])}: {e}" + ) + else: + logger.warning( + f"[ch{self.channel_id}] Upstream error (attempt {consecutive}): {e}" + ) + + url_idx = next_idx + self._status = "reconnecting" + + if cycle_done: + # All domains tried — back off before next cycle. + # Do NOT drain client queues: the buffered data (up to 32 MB) covers + # the reconnect window so players never see a black screen. + wait = min(base_wait * (2 ** (consecutive // n - 1)), _BACKOFF_CAP) + logger.warning(f"[ch{self.channel_id}] All {n} domain(s) failed, retrying in {wait:.1f}s") + await asyncio.sleep(wait) + # else: try next domain immediately (no sleep) + finally: + self._status = "stopped" + self._running = False + async with self._lock: + for handle in self._clients.values(): + _drain_queue(handle.queue) + try: + handle.queue.put_nowait(_SENTINEL) + except asyncio.QueueFull: + pass + + async def _pump_once(self, url: str | None = None) -> None: + """ + Spawn ffmpeg in copy (remux) mode and pump its stdout to all client + queues until ffmpeg exits or self._running goes False. + + Reconnection is intentionally NOT delegated to ffmpeg (-reconnect_streamed + is omitted). When the provider closes the TCP session (typically every + ~2 minutes), ffmpeg exits cleanly and _pump_with_retry immediately spawns + a fresh process that opens a brand-new HTTP connection. The provider then + delivers the stream from the current live edge — timestamps are always + forward-moving. If ffmpeg were to reconnect internally it would often + receive a few seconds of already-seen data (the provider rewinds to the + last keyframe boundary), causing a visible backward seek in the player. + """ + stream_url = url if url is not None else self.stream_url + cmd = [ + _FFMPEG, + "-hide_banner", "-loglevel", "warning", + "-timeout", str(int(STALL_TIMEOUT * 1_000_000)), + "-i", stream_url, + "-c", "copy", + "-f", "mpegts", + "pipe:1", + ] + + proc = await asyncio.create_subprocess_exec( + *cmd, + stdout=asyncio.subprocess.PIPE, + stderr=asyncio.subprocess.PIPE, + ) + + self._status = "ok" + self._last_data_at = time.time() + self._ffmpeg_pid = proc.pid + self._ffmpeg_start_time = time.time() + logger.info( + f"[ch{self.channel_id}] ffmpeg started pid={proc.pid} " + f"(reconnects so far: {self._reconnect_count})" + ) + + # Drain stderr in background so the pipe never fills and blocks ffmpeg. + stderr_task = asyncio.create_task(self._log_ffmpeg_stderr(proc)) + + try: + while self._running: + try: + chunk = await asyncio.wait_for( + proc.stdout.read(CHUNK_SIZE), + timeout=STALL_TIMEOUT + 15, # safety net beyond ffmpeg's own timeout + ) + except asyncio.TimeoutError: + raise RuntimeError( + f"ffmpeg produced no output for {STALL_TIMEOUT + 15:.0f}s" + ) + + if not chunk: + # ffmpeg exited cleanly or with error + rc = proc.returncode + raise RuntimeError(f"ffmpeg exited (rc={rc})") + + # Throughput accounting + self._bytes_pumped += len(chunk) + self._last_data_at = time.time() + now = self._last_data_at + if now - self._bps_time >= 2.0: + self._bps_down = (self._bytes_pumped - self._bytes_prev) / (now - self._bps_time) + self._bytes_prev = self._bytes_pumped + self._bps_time = now + + await self._dispatch(chunk, now) + + finally: + self._ffmpeg_pid = None + self._ffmpeg_start_time = None + self._ffmpeg_cpu = 0.0 + stderr_task.cancel() + try: + proc.kill() + except ProcessLookupError: + pass + try: + await asyncio.wait_for(proc.wait(), timeout=5) + except asyncio.TimeoutError: + pass + + async def _log_ffmpeg_stderr(self, proc: asyncio.subprocess.Process) -> None: + """Read ffmpeg stderr lines, log them and count A/V-quality events.""" + try: + async for line in proc.stderr: + text = line.decode(errors="replace").rstrip() + if text: + logger.warning(f"[ch{self.channel_id}] ffmpeg: {text}") + if any(p in text for p in _AV_WARN_PATTERNS): + self._av_desync_count += 1 + except asyncio.CancelledError: + pass + except Exception: + pass + + async def _dispatch(self, chunk: bytes, now: float) -> None: + """Push chunk to every client queue; evict clients that have been full for >30 s.""" + async with self._lock: + dead: list[str] = [] + for cid, handle in self._clients.items(): + try: + handle.queue.put_nowait(chunk) + handle._overflow_count = 0 + handle._overflow_since = None + except asyncio.QueueFull: + handle._overflow_count += 1 + if handle._overflow_since is None: + handle._overflow_since = now + elif now - handle._overflow_since > 30: + dead.append(cid) + + for cid in dead: + logger.warning( + f"[ch{self.channel_id}] Evicting unresponsive client {cid} " + f"after 30 s of sustained queue overflow" + ) + dropped = self._clients.pop(cid, None) + if dropped is not None: + _drain_queue(dropped.queue) + try: + dropped.queue.put_nowait(_SENTINEL) + except asyncio.QueueFull: + pass + + +def _drain_queue(q: asyncio.Queue) -> None: + """Empty a queue non-blockingly.""" + while not q.empty(): + try: + q.get_nowait() + except asyncio.QueueEmpty: + break diff --git a/backend/core/vod_tracker.py b/backend/core/vod_tracker.py new file mode 100644 index 0000000..000f2eb --- /dev/null +++ b/backend/core/vod_tracker.py @@ -0,0 +1,164 @@ +"""VodTracker: lightweight session tracking for VOD and Series streams.""" +import asyncio +import logging +import time +import uuid +from dataclasses import dataclass, field + +logger = logging.getLogger(__name__) + +STALE_TIMEOUT = 10 # seconds of no new bytes before a session is considered dead + + +@dataclass +class VodSession: + session_id: str + user_id: str + username: str + channel_id: int + channel_name: str + provider_account_id: int + provider_name: str + stream_type: str # "movie" or "series" + stream_url: str + started_at: float = field(default_factory=time.time) + last_active: float = field(default_factory=time.time) + bytes_pumped: int = 0 + bps_down: float = 0.0 # download speed from provider + bps_up: float = 0.0 # upload speed to client (same as down for VOD, 1 client) + running: bool = True + _stop: asyncio.Event = field(default_factory=asyncio.Event) + # Set by _proxy_vod so kill() can immediately abort the upstream connection + _http_session: object = field(default=None, repr=False) + + @property + def should_stop(self) -> bool: + return self._stop.is_set() + + def kill(self) -> None: + self._stop.set() + # Close the upstream aiohttp session immediately so iter_chunked() raises + # and the generator's finally block runs without waiting for the next chunk. + http = self._http_session + if http is not None: + try: + http.connector.close() + except Exception: + pass + + def to_dict(self) -> dict: + return { + "stream_type": self.stream_type, + "channel_id": self.channel_id, + "channel_name": self.channel_name, + "provider_account_id": self.provider_account_id, + "provider_name": self.provider_name, + "client_count": 1, + "clients": [{"client_id": self.session_id, "username": self.username}], + "started_at": self.started_at, + "bytes_pumped": self.bytes_pumped, + "bps_down": self.bps_down, + "bps_up": self.bps_up, + "running": self.running, + } + + +class VodTracker: + def __init__(self) -> None: + self._sessions: dict[str, VodSession] = {} + self._user_channel_map: dict[tuple[str, int], str] = {} + self._cleanup_task: asyncio.Task | None = None + + def _ensure_cleanup_running(self) -> None: + """Start the background staleness sweep if not already running.""" + if self._cleanup_task is None or self._cleanup_task.done(): + try: + loop = asyncio.get_running_loop() + self._cleanup_task = loop.create_task(self._cleanup_loop(), name="vod-cleanup") + except RuntimeError: + pass # no event loop yet — task will start on first session + + async def _cleanup_loop(self) -> None: + """Every 5 s, remove sessions that have received no new bytes for STALE_TIMEOUT s.""" + while True: + await asyncio.sleep(5) + now = time.time() + stale = [ + s for s in list(self._sessions.values()) + if now - s.last_active > STALE_TIMEOUT + ] + for s in stale: + logger.info( + f"Removing stale VOD session {s.session_id} " + f"(user={s.user_id}, ch={s.channel_id}, " + f"idle={now - s.last_active:.0f}s)" + ) + s.kill() + self._sessions.pop(s.session_id, None) + key = (s.user_id, s.channel_id) + if self._user_channel_map.get(key) == s.session_id: + self._user_channel_map.pop(key, None) + + def start( + self, + user_id: str, + username: str, + channel_id: int, + channel_name: str, + provider_account_id: int, + provider_name: str, + stream_type: str, + stream_url: str, + user_max_connections: int = 1, + ) -> VodSession: + self._ensure_cleanup_running() + + # Kill ALL existing VOD sessions for this user — one active VOD per user. + # Handles both probe-zombies (same channel) and movie switching (different channel). + for s in list(self._sessions.values()): + if s.user_id == user_id: + self._sessions.pop(s.session_id, None) + old_key = (s.user_id, s.channel_id) + if self._user_channel_map.get(old_key) == s.session_id: + self._user_channel_map.pop(old_key, None) + s.kill() + logger.info( + f"Killed VOD session {s.session_id} (ch={s.channel_id}) " + f"for user={user_id} — new session starting" + ) + + session_id = f"vod-{uuid.uuid4().hex[:8]}" + session = VodSession( + session_id=session_id, + user_id=user_id, + username=username, + channel_id=channel_id, + channel_name=channel_name, + provider_account_id=provider_account_id, + provider_name=provider_name, + stream_type=stream_type, + stream_url=stream_url, + ) + self._sessions[session_id] = session + self._user_channel_map[(user_id, channel_id)] = session_id + return session + + def end(self, session_id: str) -> None: + session = self._sessions.pop(session_id, None) + if session: + key = (session.user_id, session.channel_id) + if self._user_channel_map.get(key) == session_id: + self._user_channel_map.pop(key, None) + + def kill(self, session_id: str) -> bool: + s = self._sessions.get(session_id) + if s: + s.kill() + return True + return False + + def get_all(self) -> list[dict]: + return [s.to_dict() for s in self._sessions.values()] + + +vod_tracker = VodTracker() diff --git a/backend/core/xtream_client.py b/backend/core/xtream_client.py new file mode 100644 index 0000000..dc8985f --- /dev/null +++ b/backend/core/xtream_client.py @@ -0,0 +1,87 @@ +"""Client for consuming Xtream Codes API from provider.""" +import aiohttp +import asyncio +from typing import Any +import logging + +logger = logging.getLogger(__name__) + + +class XtreamClient: + def __init__(self, base_url: str, username: str, password: str): + self.base_url = base_url.rstrip("/") + self.username = username + self.password = password + + def _api_url(self) -> str: + return f"{self.base_url}/player_api.php" + + async def _get(self, params: dict) -> Any: + params = {"username": self.username, "password": self.password, **params} + timeout = aiohttp.ClientTimeout(total=30) + async with aiohttp.ClientSession(timeout=timeout) as session: + async with session.get(self._api_url(), params=params, ssl=False) as resp: + resp.raise_for_status() + return await resp.json(content_type=None) + + async def get_user_info(self) -> dict: + return await self._get({}) + + async def get_live_categories(self) -> list[dict]: + return await self._get({"action": "get_live_categories"}) + + async def get_live_streams(self, category_id: str | None = None) -> list[dict]: + params = {"action": "get_live_streams"} + if category_id: + params["category_id"] = category_id + return await self._get(params) + + async def get_vod_categories(self) -> list[dict]: + return await self._get({"action": "get_vod_categories"}) + + async def get_vod_streams(self, category_id: str | None = None) -> list[dict]: + params = {"action": "get_vod_streams"} + if category_id: + params["category_id"] = category_id + return await self._get(params) + + async def get_series_categories(self) -> list[dict]: + return await self._get({"action": "get_series_categories"}) + + async def get_series(self, category_id: str | None = None) -> list[dict]: + params = {"action": "get_series"} + if category_id: + params["category_id"] = category_id + return await self._get(params) + + async def get_series_info(self, series_id: str) -> dict: + return await self._get({"action": "get_series_info", "series_id": series_id}) + + async def get_vod_info(self, vod_id: str) -> dict: + return await self._get({"action": "get_vod_info", "vod_id": vod_id}) + + async def get_epg(self, stream_id: str | None = None) -> dict: + params = {"action": "get_short_epg"} + if stream_id: + params["stream_id"] = stream_id + return await self._get(params) + + def build_live_stream_url(self, stream_id: str, ext: str = "ts") -> str: + return f"{self.base_url}/{self.username}/{self.password}/{stream_id}.{ext}" + + def build_vod_stream_url(self, stream_id: str, ext: str = "mkv") -> str: + return f"{self.base_url}/movie/{self.username}/{self.password}/{stream_id}.{ext}" + + def build_series_stream_url(self, stream_id: str, ext: str = "mkv") -> str: + return f"{self.base_url}/series/{self.username}/{self.password}/{stream_id}.{ext}" + + def get_xmltv_url(self) -> str: + return f"{self.base_url}/xmltv.php?username={self.username}&password={self.password}" + + async def test_connection(self) -> bool: + try: + info = await self.get_user_info() + return info.get("user_info", {}).get("status") == "Active" + except Exception as e: + logger.warning(f"Provider connection test failed: {e}") + return False diff --git a/backend/database.py b/backend/database.py new file mode 100644 index 0000000..b9e1e72 --- /dev/null +++ b/backend/database.py @@ -0,0 +1,42 @@ +from sqlalchemy.ext.asyncio import create_async_engine, AsyncSession, async_sessionmaker +from sqlalchemy.orm import DeclarativeBase +from sqlalchemy import text +from .config import settings + +engine = create_async_engine( + settings.database_url, + echo=False, + pool_size=20, + max_overflow=10, + pool_pre_ping=True, +) + +AsyncSessionLocal = async_sessionmaker(engine, expire_on_commit=False, class_=AsyncSession) + + +class Base(DeclarativeBase): + pass + + +async def get_db(): + async with AsyncSessionLocal() as session: + try: + yield session + finally: + await session.close() + + +async def init_db(): + from .models import provider, channel, user, epg, custom_category, log, notification, jellyfin, stream_event # noqa: ensure all models imported + from .models.provider import ProviderUrl # noqa: ensure ProviderUrl is registered + async with engine.begin() as conn: + await conn.run_sync(Base.metadata.create_all) + # Migrate: create provider_urls entries from existing base_url if not already done + await conn.execute(text(""" + INSERT INTO provider_urls (provider_account_id, url, priority, is_active, status) + SELECT id, base_url, 0, true, 'unknown' + FROM provider_accounts + WHERE id NOT IN (SELECT DISTINCT provider_account_id FROM provider_urls WHERE provider_account_id IS NOT NULL) + ON CONFLICT DO NOTHING + """)) + await conn.commit() diff --git a/backend/main.py b/backend/main.py new file mode 100644 index 0000000..e5978cd --- /dev/null +++ b/backend/main.py @@ -0,0 +1,143 @@ +"""KiraStream — IPTV Management Server.""" +import asyncio +import logging +import sys +from contextlib import asynccontextmanager + +from fastapi import FastAPI, Depends +from fastapi.middleware.cors import CORSMiddleware +from fastapi.responses import JSONResponse +from fastapi.security import OAuth2PasswordRequestForm + +import json +from .config import settings +from .database import init_db, AsyncSessionLocal +from .core.pool import pool +from .core.epg_manager import epg_background_task +from .core.health_checker import health_check_loop +from .database import get_db + +logging.basicConfig( + level=getattr(logging, settings.log_level), + format="%(asctime)s %(levelname)s %(name)s — %(message)s", + handlers=[logging.StreamHandler(sys.stdout)], +) +logger = logging.getLogger(__name__) + + +async def _auto_sync_loop() -> None: + """Check every 30 minutes if any provider is due for auto-sync.""" + from sqlalchemy import select + from .models.provider import ProviderAccount + from .api.admin.providers import _run_sync, _sync_status + + await asyncio.sleep(60) # delay first check so startup completes + while True: + try: + async with AsyncSessionLocal() as db: + result = await db.execute( + select(ProviderAccount).where(ProviderAccount.auto_sync_hours > 0, ProviderAccount.is_active == True) # noqa: E712 + ) + providers = result.scalars().all() + now = asyncio.get_event_loop().time() + import time as _time + wall_now = _time.time() + for p in providers: + interval_secs = p.auto_sync_hours * 3600 + last_sync_ts = p.last_sync_at.timestamp() if p.last_sync_at else 0 + if wall_now - last_sync_ts >= interval_secs: + if _sync_status.get(p.id, {}).get("status") == "running": + continue + logger.info(f"Auto-sync triggered for provider {p.id} ({p.name})") + cats = json.loads(p.last_sync_categories) if p.last_sync_categories else {} + asyncio.create_task(_run_sync( + p.id, p.base_url, p.username, p.password, + selected_live=set(cats["live"]) if cats.get("live") is not None else None, + selected_movie=set(cats["movie"]) if cats.get("movie") is not None else None, + selected_series=set(cats["series"]) if cats.get("series") is not None else None, + )) + except Exception as e: + logger.error(f"Auto-sync loop error: {e}") + await asyncio.sleep(1800) # check every 30 minutes + + +@asynccontextmanager +async def lifespan(app: FastAPI): + logger.info("KiraStream starting up...") + await init_db() + await pool.init() + epg_task = asyncio.create_task(epg_background_task(get_db)) + auto_sync_task = asyncio.create_task(_auto_sync_loop()) + health_task = asyncio.create_task(health_check_loop()) + logger.info("KiraStream ready") + yield + logger.info("KiraStream shutting down...") + await pool.close() + epg_task.cancel() + auto_sync_task.cancel() + health_task.cancel() + for t in (epg_task, auto_sync_task, health_task): + try: + await t + except asyncio.CancelledError: + pass + + +app = FastAPI( + title="KiraStream", + description="Professional IPTV Management with Xtream Codes", + version="1.0.0", + lifespan=lifespan, + docs_url="/api/docs", + redoc_url="/api/redoc", +) + +app.add_middleware( + CORSMiddleware, + allow_origins=["*"], + allow_credentials=True, + allow_methods=["*"], + allow_headers=["*"], +) + +# --- Admin auth --- +from .api.auth import login, Token # noqa: E402 + +@app.post("/api/admin/auth/token", response_model=Token, tags=["admin"]) +async def admin_login(form_data: OAuth2PasswordRequestForm = Depends()): + return await login(form_data) + +# --- Admin routers --- +from .api.admin.providers import router as providers_router # noqa: E402 +from .api.admin.users import router as users_router # noqa: E402 +from .api.admin.catalogs import router as catalogs_router # noqa: E402 +from .api.admin.epg_admin import router as epg_admin_router # noqa: E402 +from .api.admin.monitoring import router as monitoring_router # noqa: E402 +from .api.admin.custom_categories import router as custom_cats_router # noqa: E402 +from .api.admin.logs import router as logs_router # noqa: E402 +from .api.admin.settings import router as settings_router # noqa: E402 +from .api.admin.jellyfin_admin import router as jellyfin_router # noqa: E402 + +app.include_router(providers_router, prefix="/api/admin") +app.include_router(users_router, prefix="/api/admin") +app.include_router(catalogs_router, prefix="/api/admin") +app.include_router(epg_admin_router, prefix="/api/admin") +app.include_router(monitoring_router, prefix="/api/admin") +app.include_router(custom_cats_router, prefix="/api/admin") +app.include_router(logs_router, prefix="/api/admin") +app.include_router(settings_router, prefix="/api/admin") +app.include_router(jellyfin_router, prefix="/api/admin") + +# --- Xtream Codes compatible API (public) --- +from .api.xtream import router as xtream_router # noqa: E402 +app.include_router(xtream_router) + + +@app.get("/health") +async def health(): + return {"status": "ok", "service": "kirastream"} + + +@app.get("/") +async def root(): + return JSONResponse({"message": "KiraStream IPTV Server", "docs": "/api/docs"}) diff --git a/backend/models/__init__.py b/backend/models/__init__.py new file mode 100644 index 0000000..4c9aad6 --- /dev/null +++ b/backend/models/__init__.py @@ -0,0 +1,15 @@ +from .provider import ProviderAccount +from .channel import Category, Channel, ChannelProviderMap, ContentType +from .user import User, UserCatalogEntry +from .epg import EpgSource + +__all__ = [ + "ProviderAccount", + "Category", + "Channel", + "ChannelProviderMap", + "ContentType", + "User", + "UserCatalogEntry", + "EpgSource", +] diff --git a/backend/models/channel.py b/backend/models/channel.py new file mode 100644 index 0000000..3aae609 --- /dev/null +++ b/backend/models/channel.py @@ -0,0 +1,61 @@ +import enum +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, Enum, UniqueConstraint, func +from sqlalchemy.orm import relationship +from ..database import Base + + +class ContentType(str, enum.Enum): + live = "live" + movie = "movie" + series = "series" + + +class Category(Base): + __tablename__ = "categories" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(300), nullable=False) + type = Column(Enum(ContentType), nullable=False) + provider_category_id = Column(String(100), nullable=True) + provider_account_id = Column(Integer, ForeignKey("provider_accounts.id", ondelete="CASCADE"), nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + channels = relationship("Channel", back_populates="category") + catalog_entries = relationship("UserCatalogEntry", back_populates="category", cascade="all, delete-orphan") + + __table_args__ = ( + UniqueConstraint("provider_category_id", "provider_account_id", "type", name="uq_category_provider"), + ) + + +class Channel(Base): + __tablename__ = "channels" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(500), nullable=False) + tvg_id = Column(String(200), nullable=True, index=True) + tvg_logo = Column(String(1000), nullable=True) + stream_id_at_provider = Column(String(100), nullable=False) + category_id = Column(Integer, ForeignKey("categories.id", ondelete="SET NULL"), nullable=True) + type = Column(Enum(ContentType), nullable=False, default=ContentType.live) + is_active = Column(Boolean, default=True, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + category = relationship("Category", back_populates="channels") + provider_maps = relationship("ChannelProviderMap", back_populates="channel", cascade="all, delete-orphan") + + +class ChannelProviderMap(Base): + __tablename__ = "channel_provider_map" + + id = Column(Integer, primary_key=True, index=True) + channel_id = Column(Integer, ForeignKey("channels.id", ondelete="CASCADE"), nullable=False) + provider_account_id = Column(Integer, ForeignKey("provider_accounts.id", ondelete="CASCADE"), nullable=False) + stream_url = Column(String(2000), nullable=False) + + channel = relationship("Channel", back_populates="provider_maps") + provider_account = relationship("ProviderAccount", back_populates="channel_maps") + + __table_args__ = ( + UniqueConstraint("channel_id", "provider_account_id", name="uq_channel_provider"), + ) diff --git a/backend/models/custom_category.py b/backend/models/custom_category.py new file mode 100644 index 0000000..b885bcf --- /dev/null +++ b/backend/models/custom_category.py @@ -0,0 +1,29 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Enum, ForeignKey, func +from sqlalchemy.orm import relationship +from ..database import Base +from .channel import ContentType + + +class CustomCategory(Base): + __tablename__ = "custom_categories" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(200), nullable=False) + type = Column(Enum(ContentType), nullable=False) + position = Column(Integer, default=0, nullable=False) + is_visible = Column(Boolean, default=True, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + items = relationship("CustomCategoryItem", back_populates="category", cascade="all, delete-orphan") + + +class CustomCategoryItem(Base): + __tablename__ = "custom_category_items" + + id = Column(Integer, primary_key=True, index=True) + custom_category_id = Column(Integer, ForeignKey("custom_categories.id"), nullable=False) + channel_id = Column(Integer, ForeignKey("channels.id"), nullable=False) + position = Column(Integer, default=0, nullable=False) + + category = relationship("CustomCategory", back_populates="items") + channel = relationship("Channel") diff --git a/backend/models/epg.py b/backend/models/epg.py new file mode 100644 index 0000000..7b60d70 --- /dev/null +++ b/backend/models/epg.py @@ -0,0 +1,13 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, func +from ..database import Base + + +class EpgSource(Base): + __tablename__ = "epg_sources" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(200), nullable=False) + url = Column(String(2000), nullable=False) + last_fetched_at = Column(DateTime(timezone=True), nullable=True) + is_active = Column(Boolean, default=True, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) diff --git a/backend/models/jellyfin.py b/backend/models/jellyfin.py new file mode 100644 index 0000000..90e2203 --- /dev/null +++ b/backend/models/jellyfin.py @@ -0,0 +1,47 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, ForeignKey, func +from sqlalchemy.orm import relationship +from ..database import Base + + +class JellyfinConfig(Base): + __tablename__ = "jellyfin_configs" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(200), nullable=False) + url = Column(String(500), nullable=False) + api_key = Column(String(300), nullable=False) + is_active = Column(Boolean, default=True, nullable=False) + movies_library_id = Column(String(100), nullable=True) + series_library_id = Column(String(100), nullable=True) + movies_category_name = Column(String(200), default="Películas KiraTV", nullable=False) + series_category_name = Column(String(200), default="Series KiraTV", nullable=False) + last_sync_at = Column(DateTime(timezone=True), nullable=True) + # Dummy ProviderAccount auto-created to satisfy ChannelProviderMap FK + provider_account_id = Column( + Integer, + ForeignKey("provider_accounts.id", ondelete="SET NULL"), + nullable=True, + ) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + items = relationship("JellyfinItem", back_populates="config", cascade="all, delete-orphan") + + +class JellyfinItem(Base): + __tablename__ = "jellyfin_items" + + id = Column(Integer, primary_key=True, index=True) + jellyfin_config_id = Column( + Integer, ForeignKey("jellyfin_configs.id", ondelete="CASCADE"), nullable=False + ) + channel_id = Column( + Integer, ForeignKey("channels.id", ondelete="CASCADE"), nullable=True + ) + jellyfin_item_id = Column(String(100), nullable=False, index=True) # Jellyfin hex ID + item_type = Column(String(20), nullable=False) # "movie" | "series" + plot = Column(Text, nullable=True) + year = Column(Integer, nullable=True) + genres = Column(String(500), nullable=True) + rating = Column(String(20), nullable=True) + + config = relationship("JellyfinConfig", back_populates="items") diff --git a/backend/models/log.py b/backend/models/log.py new file mode 100644 index 0000000..4cb913b --- /dev/null +++ b/backend/models/log.py @@ -0,0 +1,19 @@ +from sqlalchemy import Column, Integer, BigInteger, String, DateTime, func +from ..database import Base + + +class ConnectionLog(Base): + __tablename__ = "connection_logs" + + id = Column(BigInteger, primary_key=True, index=True) + user_id = Column(Integer, nullable=False, index=True) + username = Column(String(200), nullable=False, index=True) + channel_id = Column(Integer, nullable=True) + channel_name = Column(String(500), nullable=True) + content_type = Column(String(20), nullable=True) # live, movie, series + stream_id = Column(String(100), nullable=True) + started_at = Column(DateTime(timezone=True), server_default=func.now(), index=True) + ended_at = Column(DateTime(timezone=True), nullable=True) + duration_seconds = Column(Integer, nullable=True) + bytes_transferred = Column(BigInteger, default=0, nullable=False) + client_ip = Column(String(100), nullable=True) diff --git a/backend/models/notification.py b/backend/models/notification.py new file mode 100644 index 0000000..2d477ae --- /dev/null +++ b/backend/models/notification.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, Integer, String, DateTime, ForeignKey, UniqueConstraint, func +from ..database import Base + + +class NotificationDismissal(Base): + __tablename__ = "notification_dismissals" + + id = Column(Integer, primary_key=True, index=True) + provider_id = Column(Integer, ForeignKey("provider_accounts.id", ondelete="CASCADE"), nullable=False) + category_id_str = Column(String(100), nullable=False) + category_type = Column(String(20), nullable=False) + dismissed_at = Column(DateTime(timezone=True), server_default=func.now()) + + __table_args__ = ( + UniqueConstraint("provider_id", "category_id_str", "category_type", name="uq_dismissal"), + ) diff --git a/backend/models/provider.py b/backend/models/provider.py new file mode 100644 index 0000000..4f46a65 --- /dev/null +++ b/backend/models/provider.py @@ -0,0 +1,41 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, Text, ForeignKey, func +from sqlalchemy.orm import relationship +from ..database import Base + + +class ProviderAccount(Base): + __tablename__ = "provider_accounts" + + id = Column(Integer, primary_key=True, index=True) + name = Column(String(100), nullable=False) + base_url = Column(String(500), nullable=False) + username = Column(String(200), nullable=False) + password = Column(String(200), nullable=False) + max_connections = Column(Integer, default=1, nullable=False) + is_active = Column(Boolean, default=True, nullable=False) + last_sync_at = Column(DateTime(timezone=True), nullable=True) + expiry_date = Column(DateTime(timezone=True), nullable=True) + # 0 = disabled; 6/12/24 = sync every N hours automatically + auto_sync_hours = Column(Integer, default=0, nullable=False) + # JSON: {"live": ["cat_id", ...], "movie": [...], "series": [...]} + last_sync_categories = Column(Text, nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + channel_maps = relationship("ChannelProviderMap", back_populates="provider_account", cascade="all, delete-orphan") + extra_urls = relationship("ProviderUrl", back_populates="provider_account", cascade="all, delete-orphan", order_by="ProviderUrl.priority") + + +class ProviderUrl(Base): + __tablename__ = "provider_urls" + + id = Column(Integer, primary_key=True, index=True) + provider_account_id = Column(Integer, ForeignKey("provider_accounts.id", ondelete="CASCADE"), nullable=False, index=True) + url = Column(String(500), nullable=False) + priority = Column(Integer, default=0, nullable=False) # 0=primary, higher=lower priority + is_active = Column(Boolean, default=True, nullable=False) + status = Column(String(20), default="unknown", nullable=False) # unknown|ok|error|timeout + response_ms = Column(Integer, nullable=True) + last_checked_at = Column(DateTime(timezone=True), nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + provider_account = relationship("ProviderAccount", back_populates="extra_urls") diff --git a/backend/models/stream_event.py b/backend/models/stream_event.py new file mode 100644 index 0000000..70bdc9a --- /dev/null +++ b/backend/models/stream_event.py @@ -0,0 +1,16 @@ +from sqlalchemy import Column, BigInteger, Integer, String, Text, DateTime, func +from ..database import Base + + +class StreamEvent(Base): + __tablename__ = "stream_events" + + id = Column(BigInteger, primary_key=True, index=True) + channel_id = Column(Integer, nullable=True, index=True) + channel_name = Column(String(500), nullable=True) + provider_name = Column(String(200), nullable=True) + event_type = Column(String(50), nullable=False, index=True) # caida | recuperado + domain = Column(String(300), nullable=True) + error_message = Column(Text, nullable=True) + attempt_number = Column(Integer, nullable=True) + created_at = Column(DateTime(timezone=True), server_default=func.now(), index=True) diff --git a/backend/models/user.py b/backend/models/user.py new file mode 100644 index 0000000..691966f --- /dev/null +++ b/backend/models/user.py @@ -0,0 +1,66 @@ +from sqlalchemy import Column, Integer, String, Boolean, DateTime, ForeignKey, UniqueConstraint, func +from sqlalchemy.orm import relationship +import bcrypt as _bcrypt +from ..database import Base + + +class User(Base): + __tablename__ = "users" + + id = Column(Integer, primary_key=True, index=True) + username = Column(String(100), unique=True, nullable=False, index=True) + password_hash = Column(String(200), nullable=False) + max_connections = Column(Integer, default=1, nullable=False) + expiry_date = Column(DateTime(timezone=True), nullable=True) + is_active = Column(Boolean, default=True, nullable=False) + is_priority = Column(Boolean, default=False, nullable=False) + created_at = Column(DateTime(timezone=True), server_default=func.now()) + + catalog_entries = relationship("UserCatalogEntry", back_populates="user", cascade="all, delete-orphan") + provider_preferences = relationship("UserProviderPreference", back_populates="user", cascade="all, delete-orphan", order_by="UserProviderPreference.priority") + + def set_password(self, password: str) -> None: + hashed = _bcrypt.hashpw(password.encode(), _bcrypt.gensalt()) + self.password_hash = hashed.decode() + + def verify_password(self, password: str) -> bool: + return _bcrypt.checkpw(password.encode(), self.password_hash.encode()) + + +class UserCatalogEntry(Base): + __tablename__ = "user_catalog_entries" + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) + category_id = Column(Integer, ForeignKey("categories.id", ondelete="CASCADE"), nullable=False) + + user = relationship("User", back_populates="catalog_entries") + category = relationship("Category", back_populates="catalog_entries") + + +class UserCustomCatalogEntry(Base): + __tablename__ = "user_custom_catalog_entries" + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) + custom_category_id = Column(Integer, ForeignKey("custom_categories.id", ondelete="CASCADE"), nullable=False) + + __table_args__ = ( + UniqueConstraint("user_id", "custom_category_id", name="uq_user_custom_cat"), + ) + + +class UserProviderPreference(Base): + __tablename__ = "user_provider_preferences" + + id = Column(Integer, primary_key=True, index=True) + user_id = Column(Integer, ForeignKey("users.id", ondelete="CASCADE"), nullable=False) + provider_account_id = Column(Integer, ForeignKey("provider_accounts.id", ondelete="CASCADE"), nullable=False) + priority = Column(Integer, default=0, nullable=False) + + user = relationship("User", back_populates="provider_preferences") + provider_account = relationship("ProviderAccount") + + __table_args__ = ( + UniqueConstraint("user_id", "provider_account_id", name="uq_user_provider_pref"), + ) diff --git a/backend/static/assets/index-Bf2TNXpE.css b/backend/static/assets/index-Bf2TNXpE.css new file mode 100644 index 0000000..41c110e --- /dev/null +++ b/backend/static/assets/index-Bf2TNXpE.css @@ -0,0 +1 @@ +*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}html,:host{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent}body{margin:0;line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}ol,ul,menu{list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}img,svg,video,canvas,audio,iframe,embed,object{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}body{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1));font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1));-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}::-webkit-scrollbar-thumb{border-radius:.25rem;--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{top:0;right:0;bottom:0;left:0}.-right-1{right:-.25rem}.-top-1{top:-.25rem}.left-0{left:0}.left-2\.5{left:.625rem}.left-3{left:.75rem}.top-1\/2{top:50%}.top-full{top:100%}.z-50{z-index:50}.col-span-2{grid-column:span 2 / span 2}.col-span-full{grid-column:1 / -1}.mx-auto{margin-left:auto;margin-right:auto}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:.25rem}.mb-2{margin-bottom:.5rem}.mb-3{margin-bottom:.75rem}.mb-6{margin-bottom:1.5rem}.mb-8{margin-bottom:2rem}.ml-1{margin-left:.25rem}.ml-2{margin-left:.5rem}.ml-auto{margin-left:auto}.mr-1{margin-right:.25rem}.mt-0\.5{margin-top:.125rem}.mt-1{margin-top:.25rem}.mt-1\.5{margin-top:.375rem}.mt-2{margin-top:.5rem}.mt-4{margin-top:1rem}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.grid{display:grid}.hidden{display:none}.h-1\.5{height:.375rem}.h-10{height:2.5rem}.h-2{height:.5rem}.h-4{height:1rem}.h-6{height:1.5rem}.h-8{height:2rem}.h-full{height:100%}.h-screen{height:100vh}.max-h-48{max-height:12rem}.max-h-64{max-height:16rem}.max-h-72{max-height:18rem}.max-h-\[70vh\]{max-height:70vh}.max-h-\[80vh\]{max-height:80vh}.max-h-\[85vh\]{max-height:85vh}.max-h-\[90vh\]{max-height:90vh}.min-h-screen{min-height:100vh}.w-1\.5{width:.375rem}.w-10{width:2.5rem}.w-2{width:.5rem}.w-36{width:9rem}.w-4{width:1rem}.w-48{width:12rem}.w-56{width:14rem}.w-6{width:1.5rem}.w-72{width:18rem}.w-8{width:2rem}.w-80{width:20rem}.w-full{width:100%}.min-w-0{min-width:0px}.min-w-\[140px\]{min-width:140px}.min-w-\[160px\]{min-width:160px}.max-w-2xl{max-width:42rem}.max-w-4xl{max-width:56rem}.max-w-\[160px\]{max-width:160px}.max-w-\[180px\]{max-width:180px}.max-w-\[240px\]{max-width:240px}.max-w-lg{max-width:32rem}.max-w-md{max-width:28rem}.max-w-sm{max-width:24rem}.max-w-xl{max-width:36rem}.max-w-xs{max-width:20rem}.flex-1{flex:1 1 0%}.shrink-0{flex-shrink:0}.-translate-y-1\/2{--tw-translate-y: -50%;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes pulse{50%{opacity:.5}}.animate-pulse{animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.cursor-not-allowed{cursor:not-allowed}.cursor-pointer{cursor:pointer}.select-none{-webkit-user-select:none;-moz-user-select:none;user-select:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-wrap{flex-wrap:wrap}.items-start{align-items:flex-start}.items-end{align-items:flex-end}.items-center{align-items:center}.justify-end{justify-content:flex-end}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-0\.5{gap:.125rem}.gap-1{gap:.25rem}.gap-1\.5{gap:.375rem}.gap-2{gap:.5rem}.gap-3{gap:.75rem}.gap-4{gap:1rem}.space-y-0\.5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.125rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.125rem * var(--tw-space-y-reverse))}.space-y-1>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.25rem * var(--tw-space-y-reverse))}.space-y-2>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.5rem * var(--tw-space-y-reverse))}.space-y-3>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(.75rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(.75rem * var(--tw-space-y-reverse))}.space-y-4>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1rem * var(--tw-space-y-reverse))}.space-y-5>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.25rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.25rem * var(--tw-space-y-reverse))}.space-y-6>:not([hidden])~:not([hidden]){--tw-space-y-reverse: 0;margin-top:calc(1.5rem * calc(1 - var(--tw-space-y-reverse)));margin-bottom:calc(1.5rem * var(--tw-space-y-reverse))}.self-center{align-self:center}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-x-auto{overflow-x:auto}.overflow-y-auto{overflow-y:auto}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.whitespace-nowrap{white-space:nowrap}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.rounded-xl{border-radius:.75rem}.rounded-t-lg{border-top-left-radius:.5rem;border-top-right-radius:.5rem}.border{border-width:1px}.border-2{border-width:2px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-r{border-right-width:1px}.border-t{border-top-width:1px}.border-dashed{border-style:dashed}.border-blue-800{--tw-border-opacity: 1;border-color:rgb(30 64 175 / var(--tw-border-opacity, 1))}.border-cyan-800{--tw-border-opacity: 1;border-color:rgb(21 94 117 / var(--tw-border-opacity, 1))}.border-dark-600{--tw-border-opacity: 1;border-color:rgb(71 85 105 / var(--tw-border-opacity, 1))}.border-dark-700{--tw-border-opacity: 1;border-color:rgb(51 65 85 / var(--tw-border-opacity, 1))}.border-dark-700\/50{border-color:#33415580}.border-green-800{--tw-border-opacity: 1;border-color:rgb(22 101 52 / var(--tw-border-opacity, 1))}.border-orange-700{--tw-border-opacity: 1;border-color:rgb(194 65 12 / var(--tw-border-opacity, 1))}.border-orange-800{--tw-border-opacity: 1;border-color:rgb(154 52 18 / var(--tw-border-opacity, 1))}.border-primary-500{--tw-border-opacity: 1;border-color:rgb(59 91 219 / var(--tw-border-opacity, 1))}.border-primary-500\/20{border-color:#3b5bdb33}.border-primary-700{--tw-border-opacity: 1;border-color:rgb(44 68 168 / var(--tw-border-opacity, 1))}.border-purple-800{--tw-border-opacity: 1;border-color:rgb(107 33 168 / var(--tw-border-opacity, 1))}.border-red-500{--tw-border-opacity: 1;border-color:rgb(239 68 68 / var(--tw-border-opacity, 1))}.border-red-700{--tw-border-opacity: 1;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))}.border-red-800{--tw-border-opacity: 1;border-color:rgb(153 27 27 / var(--tw-border-opacity, 1))}.border-transparent{border-color:transparent}.border-violet-800{--tw-border-opacity: 1;border-color:rgb(91 33 182 / var(--tw-border-opacity, 1))}.border-yellow-800{--tw-border-opacity: 1;border-color:rgb(133 77 14 / var(--tw-border-opacity, 1))}.bg-black\/40{background-color:#0006}.bg-black\/60{background-color:#0009}.bg-black\/70{background-color:#000000b3}.bg-blue-500\/10{background-color:#3b82f61a}.bg-blue-500\/20{background-color:#3b82f633}.bg-blue-900\/30{background-color:#1e3a8a4d}.bg-blue-900\/40{background-color:#1e3a8a66}.bg-cyan-900\/40{background-color:#164e6366}.bg-dark-600{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.bg-dark-700{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.bg-dark-700\/40{background-color:#33415566}.bg-dark-800{--tw-bg-opacity: 1;background-color:rgb(30 41 59 / var(--tw-bg-opacity, 1))}.bg-dark-900{--tw-bg-opacity: 1;background-color:rgb(15 23 42 / var(--tw-bg-opacity, 1))}.bg-dark-900\/40{background-color:#0f172a66}.bg-dark-900\/50{background-color:#0f172a80}.bg-dark-900\/80{background-color:#0f172acc}.bg-emerald-500{--tw-bg-opacity: 1;background-color:rgb(16 185 129 / var(--tw-bg-opacity, 1))}.bg-emerald-500\/20{background-color:#10b98133}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-green-400{--tw-bg-opacity: 1;background-color:rgb(74 222 128 / var(--tw-bg-opacity, 1))}.bg-green-500{--tw-bg-opacity: 1;background-color:rgb(34 197 94 / var(--tw-bg-opacity, 1))}.bg-green-900\/20{background-color:#14532d33}.bg-green-900\/30{background-color:#14532d4d}.bg-green-900\/40{background-color:#14532d66}.bg-green-900\/50{background-color:#14532d80}.bg-orange-500\/20{background-color:#f9731633}.bg-orange-900\/30{background-color:#7c2d124d}.bg-orange-900\/40{background-color:#7c2d1266}.bg-primary-500{--tw-bg-opacity: 1;background-color:rgb(59 91 219 / var(--tw-bg-opacity, 1))}.bg-primary-500\/10{background-color:#3b5bdb1a}.bg-primary-500\/20{background-color:#3b5bdb33}.bg-primary-600{--tw-bg-opacity: 1;background-color:rgb(52 81 199 / var(--tw-bg-opacity, 1))}.bg-primary-900\/20{background-color:#1a2a6b33}.bg-primary-900\/40{background-color:#1a2a6b66}.bg-purple-500\/20{background-color:#a855f733}.bg-purple-900\/30{background-color:#581c874d}.bg-purple-900\/40{background-color:#581c8766}.bg-red-400{--tw-bg-opacity: 1;background-color:rgb(248 113 113 / var(--tw-bg-opacity, 1))}.bg-red-500{--tw-bg-opacity: 1;background-color:rgb(239 68 68 / var(--tw-bg-opacity, 1))}.bg-red-500\/20{background-color:#ef444433}.bg-red-900\/20{background-color:#7f1d1d33}.bg-red-900\/30{background-color:#7f1d1d4d}.bg-red-900\/40{background-color:#7f1d1d66}.bg-violet-900\/40{background-color:#4c1d9566}.bg-yellow-400{--tw-bg-opacity: 1;background-color:rgb(250 204 21 / var(--tw-bg-opacity, 1))}.bg-yellow-500{--tw-bg-opacity: 1;background-color:rgb(234 179 8 / var(--tw-bg-opacity, 1))}.bg-yellow-900\/20{background-color:#713f1233}.bg-yellow-900\/40{background-color:#713f1266}.object-contain{-o-object-fit:contain;object-fit:contain}.p-0\.5{padding:.125rem}.p-1{padding:.25rem}.p-1\.5{padding:.375rem}.p-10{padding:2.5rem}.p-12{padding:3rem}.p-2{padding:.5rem}.p-2\.5{padding:.625rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-5{padding:1.25rem}.p-6{padding:1.5rem}.p-8{padding:2rem}.px-1{padding-left:.25rem;padding-right:.25rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-12{padding-top:3rem;padding-bottom:3rem}.py-16{padding-top:4rem;padding-bottom:4rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-2\.5{padding-top:.625rem;padding-bottom:.625rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-0{padding-bottom:0}.pb-3{padding-bottom:.75rem}.pb-4{padding-bottom:1rem}.pl-8{padding-left:2rem}.pl-9{padding-left:2.25rem}.pr-3{padding-right:.75rem}.pt-0\.5{padding-top:.125rem}.pt-1{padding-top:.25rem}.pt-3{padding-top:.75rem}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.font-mono{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.text-2xl{font-size:1.5rem;line-height:2rem}.text-3xl{font-size:1.875rem;line-height:2.25rem}.text-\[10px\]{font-size:10px}.text-\[9px\]{font-size:9px}.text-base{font-size:1rem;line-height:1.5rem}.text-lg{font-size:1.125rem;line-height:1.75rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.uppercase{text-transform:uppercase}.normal-case{text-transform:none}.italic{font-style:italic}.tabular-nums{--tw-numeric-spacing: tabular-nums;font-variant-numeric:var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction)}.leading-tight{line-height:1.25}.tracking-tight{letter-spacing:-.025em}.tracking-wider{letter-spacing:.05em}.text-black{--tw-text-opacity: 1;color:rgb(0 0 0 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-cyan-300{--tw-text-opacity: 1;color:rgb(103 232 249 / var(--tw-text-opacity, 1))}.text-cyan-400{--tw-text-opacity: 1;color:rgb(34 211 238 / var(--tw-text-opacity, 1))}.text-emerald-400{--tw-text-opacity: 1;color:rgb(52 211 153 / var(--tw-text-opacity, 1))}.text-emerald-500{--tw-text-opacity: 1;color:rgb(16 185 129 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-gray-500{--tw-text-opacity: 1;color:rgb(107 114 128 / var(--tw-text-opacity, 1))}.text-gray-600{--tw-text-opacity: 1;color:rgb(75 85 99 / var(--tw-text-opacity, 1))}.text-gray-700{--tw-text-opacity: 1;color:rgb(55 65 81 / var(--tw-text-opacity, 1))}.text-green-300{--tw-text-opacity: 1;color:rgb(134 239 172 / var(--tw-text-opacity, 1))}.text-green-400{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.text-green-500{--tw-text-opacity: 1;color:rgb(34 197 94 / var(--tw-text-opacity, 1))}.text-orange-300{--tw-text-opacity: 1;color:rgb(253 186 116 / var(--tw-text-opacity, 1))}.text-orange-400{--tw-text-opacity: 1;color:rgb(251 146 60 / var(--tw-text-opacity, 1))}.text-primary-500{--tw-text-opacity: 1;color:rgb(59 91 219 / var(--tw-text-opacity, 1))}.text-purple-300{--tw-text-opacity: 1;color:rgb(216 180 254 / var(--tw-text-opacity, 1))}.text-purple-400{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-red-500{--tw-text-opacity: 1;color:rgb(239 68 68 / var(--tw-text-opacity, 1))}.text-violet-300{--tw-text-opacity: 1;color:rgb(196 181 253 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.text-yellow-500{--tw-text-opacity: 1;color:rgb(234 179 8 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-30{opacity:.3}.opacity-40{opacity:.4}.opacity-70{opacity:.7}.shadow-2xl{--tw-shadow: 0 25px 50px -12px rgb(0 0 0 / .25);--tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.\!filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)!important}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition-all{transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-700{transition-duration:.7s}.hover\:bg-dark-600:hover{--tw-bg-opacity: 1;background-color:rgb(71 85 105 / var(--tw-bg-opacity, 1))}.hover\:bg-dark-700:hover{--tw-bg-opacity: 1;background-color:rgb(51 65 85 / var(--tw-bg-opacity, 1))}.hover\:bg-dark-700\/30:hover{background-color:#3341554d}.hover\:bg-dark-700\/50:hover{background-color:#33415580}.hover\:bg-primary-500:hover{--tw-bg-opacity: 1;background-color:rgb(59 91 219 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-500\/30:hover{background-color:#3b5bdb4d}.hover\:bg-primary-600:hover{--tw-bg-opacity: 1;background-color:rgb(52 81 199 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-700:hover{--tw-bg-opacity: 1;background-color:rgb(44 68 168 / var(--tw-bg-opacity, 1))}.hover\:bg-primary-900\/30:hover{background-color:#1a2a6b4d}.hover\:bg-primary-900\/70:hover{background-color:#1a2a6bb3}.hover\:bg-red-500\/30:hover{background-color:#ef44444d}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:bg-red-900\/40:hover{background-color:#7f1d1d66}.hover\:bg-yellow-900\/30:hover{background-color:#713f124d}.hover\:text-blue-400:hover{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.hover\:text-gray-100:hover{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.hover\:text-gray-300:hover{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.hover\:text-green-400:hover{--tw-text-opacity: 1;color:rgb(74 222 128 / var(--tw-text-opacity, 1))}.hover\:text-purple-400:hover{--tw-text-opacity: 1;color:rgb(192 132 252 / var(--tw-text-opacity, 1))}.hover\:text-red-400:hover{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.hover\:text-white:hover{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.hover\:text-yellow-400:hover{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.hover\:opacity-100:hover{opacity:1}.focus\:border-primary-500:focus{--tw-border-opacity: 1;border-color:rgb(59 91 219 / var(--tw-border-opacity, 1))}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.disabled\:opacity-40:disabled{opacity:.4}.disabled\:opacity-50:disabled{opacity:.5}.group:hover .group-hover\:opacity-100{opacity:1}@media(min-width:640px){.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}}@media(min-width:1024px){.lg\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.lg\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}.lg\:grid-cols-6{grid-template-columns:repeat(6,minmax(0,1fr))}}@media(min-width:1280px){.xl\:grid-cols-4{grid-template-columns:repeat(4,minmax(0,1fr))}} diff --git a/backend/static/assets/index-H1dlHjcY.js b/backend/static/assets/index-H1dlHjcY.js new file mode 100644 index 0000000..20f3787 --- /dev/null +++ b/backend/static/assets/index-H1dlHjcY.js @@ -0,0 +1,278 @@ +function Im(s,a){for(var i=0;ic[d]})}}}return Object.freeze(Object.defineProperty(s,Symbol.toStringTag,{value:"Module"}))}(function(){const a=document.createElement("link").relList;if(a&&a.supports&&a.supports("modulepreload"))return;for(const d of document.querySelectorAll('link[rel="modulepreload"]'))c(d);new MutationObserver(d=>{for(const f of d)if(f.type==="childList")for(const m of f.addedNodes)m.tagName==="LINK"&&m.rel==="modulepreload"&&c(m)}).observe(document,{childList:!0,subtree:!0});function i(d){const f={};return d.integrity&&(f.integrity=d.integrity),d.referrerPolicy&&(f.referrerPolicy=d.referrerPolicy),d.crossOrigin==="use-credentials"?f.credentials="include":d.crossOrigin==="anonymous"?f.credentials="omit":f.credentials="same-origin",f}function c(d){if(d.ep)return;d.ep=!0;const f=i(d);fetch(d.href,f)}})();function nf(s){return s&&s.__esModule&&Object.prototype.hasOwnProperty.call(s,"default")?s.default:s}var no={exports:{}},Es={},ro={exports:{}},be={};/** + * @license React + * react.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var yd;function $m(){if(yd)return be;yd=1;var s=Symbol.for("react.element"),a=Symbol.for("react.portal"),i=Symbol.for("react.fragment"),c=Symbol.for("react.strict_mode"),d=Symbol.for("react.profiler"),f=Symbol.for("react.provider"),m=Symbol.for("react.context"),h=Symbol.for("react.forward_ref"),x=Symbol.for("react.suspense"),y=Symbol.for("react.memo"),j=Symbol.for("react.lazy"),_=Symbol.iterator;function O(b){return b===null||typeof b!="object"?null:(b=_&&b[_]||b["@@iterator"],typeof b=="function"?b:null)}var B={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},L=Object.assign,P={};function N(b,I,te){this.props=b,this.context=I,this.refs=P,this.updater=te||B}N.prototype.isReactComponent={},N.prototype.setState=function(b,I){if(typeof b!="object"&&typeof b!="function"&&b!=null)throw Error("setState(...): takes an object of state variables to update or a function which returns an object of state variables.");this.updater.enqueueSetState(this,b,I,"setState")},N.prototype.forceUpdate=function(b){this.updater.enqueueForceUpdate(this,b,"forceUpdate")};function A(){}A.prototype=N.prototype;function M(b,I,te){this.props=b,this.context=I,this.refs=P,this.updater=te||B}var K=M.prototype=new A;K.constructor=M,L(K,N.prototype),K.isPureReactComponent=!0;var Q=Array.isArray,me=Object.prototype.hasOwnProperty,fe={current:null},z={key:!0,ref:!0,__self:!0,__source:!0};function ae(b,I,te){var pe,ye={},Ne=null,we=null;if(I!=null)for(pe in I.ref!==void 0&&(we=I.ref),I.key!==void 0&&(Ne=""+I.key),I)me.call(I,pe)&&!z.hasOwnProperty(pe)&&(ye[pe]=I[pe]);var oe=arguments.length-2;if(oe===1)ye.children=te;else if(1>>1,I=U[b];if(0>>1;bd(ye,G))Ned(we,ye)?(U[b]=we,U[Ne]=G,b=Ne):(U[b]=ye,U[pe]=G,b=pe);else if(Ned(we,G))U[b]=we,U[Ne]=G,b=Ne;else break e}}return ee}function d(U,ee){var G=U.sortIndex-ee.sortIndex;return G!==0?G:U.id-ee.id}if(typeof performance=="object"&&typeof performance.now=="function"){var f=performance;s.unstable_now=function(){return f.now()}}else{var m=Date,h=m.now();s.unstable_now=function(){return m.now()-h}}var x=[],y=[],j=1,_=null,O=3,B=!1,L=!1,P=!1,N=typeof setTimeout=="function"?setTimeout:null,A=typeof clearTimeout=="function"?clearTimeout:null,M=typeof setImmediate<"u"?setImmediate:null;typeof navigator<"u"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function K(U){for(var ee=i(y);ee!==null;){if(ee.callback===null)c(y);else if(ee.startTime<=U)c(y),ee.sortIndex=ee.expirationTime,a(x,ee);else break;ee=i(y)}}function Q(U){if(P=!1,K(U),!L)if(i(x)!==null)L=!0,ge(me);else{var ee=i(y);ee!==null&&D(Q,ee.startTime-U)}}function me(U,ee){L=!1,P&&(P=!1,A(ae),ae=-1),B=!0;var G=O;try{for(K(ee),_=i(x);_!==null&&(!(_.expirationTime>ee)||U&&!je());){var b=_.callback;if(typeof b=="function"){_.callback=null,O=_.priorityLevel;var I=b(_.expirationTime<=ee);ee=s.unstable_now(),typeof I=="function"?_.callback=I:_===i(x)&&c(x),K(ee)}else c(x);_=i(x)}if(_!==null)var te=!0;else{var pe=i(y);pe!==null&&D(Q,pe.startTime-ee),te=!1}return te}finally{_=null,O=G,B=!1}}var fe=!1,z=null,ae=-1,de=5,Y=-1;function je(){return!(s.unstable_now()-YU||125b?(U.sortIndex=G,a(y,U),i(x)===null&&U===i(y)&&(P?(A(ae),ae=-1):P=!0,D(Q,G-b))):(U.sortIndex=I,a(x,U),L||B||(L=!0,ge(me))),U},s.unstable_shouldYield=je,s.unstable_wrapCallback=function(U){var ee=O;return function(){var G=O;O=ee;try{return U.apply(this,arguments)}finally{O=G}}}})(ao)),ao}var Nd;function qm(){return Nd||(Nd=1,lo.exports=Wm()),lo.exports}/** + * @license React + * react-dom.production.min.js + * + * Copyright (c) Facebook, Inc. and its affiliates. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */var Sd;function Km(){if(Sd)return gt;Sd=1;var s=Ro(),a=qm();function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n"u"||typeof window.document>"u"||typeof window.document.createElement>"u"),x=Object.prototype.hasOwnProperty,y=/^[:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD][:A-Z_a-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u02FF\u0370-\u037D\u037F-\u1FFF\u200C-\u200D\u2070-\u218F\u2C00-\u2FEF\u3001-\uD7FF\uF900-\uFDCF\uFDF0-\uFFFD\-.0-9\u00B7\u0300-\u036F\u203F-\u2040]*$/,j={},_={};function O(e){return x.call(_,e)?!0:x.call(j,e)?!1:y.test(e)?_[e]=!0:(j[e]=!0,!1)}function B(e,t,n,r){if(n!==null&&n.type===0)return!1;switch(typeof t){case"function":case"symbol":return!0;case"boolean":return r?!1:n!==null?!n.acceptsBooleans:(e=e.toLowerCase().slice(0,5),e!=="data-"&&e!=="aria-");default:return!1}}function L(e,t,n,r){if(t===null||typeof t>"u"||B(e,t,n,r))return!0;if(r)return!1;if(n!==null)switch(n.type){case 3:return!t;case 4:return t===!1;case 5:return isNaN(t);case 6:return isNaN(t)||1>t}return!1}function P(e,t,n,r,o,u,p){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=o,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=u,this.removeEmptyString=p}var N={};"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style".split(" ").forEach(function(e){N[e]=new P(e,0,!1,e,null,!1,!1)}),[["acceptCharset","accept-charset"],["className","class"],["htmlFor","for"],["httpEquiv","http-equiv"]].forEach(function(e){var t=e[0];N[t]=new P(t,1,!1,e[1],null,!1,!1)}),["contentEditable","draggable","spellCheck","value"].forEach(function(e){N[e]=new P(e,2,!1,e.toLowerCase(),null,!1,!1)}),["autoReverse","externalResourcesRequired","focusable","preserveAlpha"].forEach(function(e){N[e]=new P(e,2,!1,e,null,!1,!1)}),"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope".split(" ").forEach(function(e){N[e]=new P(e,3,!1,e.toLowerCase(),null,!1,!1)}),["checked","multiple","muted","selected"].forEach(function(e){N[e]=new P(e,3,!0,e,null,!1,!1)}),["capture","download"].forEach(function(e){N[e]=new P(e,4,!1,e,null,!1,!1)}),["cols","rows","size","span"].forEach(function(e){N[e]=new P(e,6,!1,e,null,!1,!1)}),["rowSpan","start"].forEach(function(e){N[e]=new P(e,5,!1,e.toLowerCase(),null,!1,!1)});var A=/[\-:]([a-z])/g;function M(e){return e[1].toUpperCase()}"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height".split(" ").forEach(function(e){var t=e.replace(A,M);N[t]=new P(t,1,!1,e,null,!1,!1)}),"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type".split(" ").forEach(function(e){var t=e.replace(A,M);N[t]=new P(t,1,!1,e,"http://www.w3.org/1999/xlink",!1,!1)}),["xml:base","xml:lang","xml:space"].forEach(function(e){var t=e.replace(A,M);N[t]=new P(t,1,!1,e,"http://www.w3.org/XML/1998/namespace",!1,!1)}),["tabIndex","crossOrigin"].forEach(function(e){N[e]=new P(e,1,!1,e.toLowerCase(),null,!1,!1)}),N.xlinkHref=new P("xlinkHref",1,!1,"xlink:href","http://www.w3.org/1999/xlink",!0,!1),["src","href","action","formAction"].forEach(function(e){N[e]=new P(e,1,!1,e.toLowerCase(),null,!0,!0)});function K(e,t,n,r){var o=N.hasOwnProperty(t)?N[t]:null;(o!==null?o.type!==0:r||!(2g||o[p]!==u[g]){var k=` +`+o[p].replace(" at new "," at ");return e.displayName&&k.includes("")&&(k=k.replace("",e.displayName)),k}while(1<=p&&0<=g);break}}}finally{te=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:"")?I(e):""}function ye(e){switch(e.tag){case 5:return I(e.type);case 16:return I("Lazy");case 13:return I("Suspense");case 19:return I("SuspenseList");case 0:case 2:case 15:return e=pe(e.type,!1),e;case 11:return e=pe(e.type.render,!1),e;case 1:return e=pe(e.type,!0),e;default:return""}}function Ne(e){if(e==null)return null;if(typeof e=="function")return e.displayName||e.name||null;if(typeof e=="string")return e;switch(e){case z:return"Fragment";case fe:return"Portal";case de:return"Profiler";case ae:return"StrictMode";case ze:return"Suspense";case Ee:return"SuspenseList"}if(typeof e=="object")switch(e.$$typeof){case je:return(e.displayName||"Context")+".Consumer";case Y:return(e._context.displayName||"Context")+".Provider";case Te:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||"",e=e!==""?"ForwardRef("+e+")":"ForwardRef"),e;case q:return t=e.displayName||null,t!==null?t:Ne(e.type)||"Memo";case ge:t=e._payload,e=e._init;try{return Ne(e(t))}catch{}}return null}function we(e){var t=e.type;switch(e.tag){case 24:return"Cache";case 9:return(t.displayName||"Context")+".Consumer";case 10:return(t._context.displayName||"Context")+".Provider";case 18:return"DehydratedFragment";case 11:return e=t.render,e=e.displayName||e.name||"",t.displayName||(e!==""?"ForwardRef("+e+")":"ForwardRef");case 7:return"Fragment";case 5:return t;case 4:return"Portal";case 3:return"Root";case 6:return"Text";case 16:return Ne(t);case 8:return t===ae?"StrictMode":"Mode";case 22:return"Offscreen";case 12:return"Profiler";case 21:return"Scope";case 13:return"Suspense";case 19:return"SuspenseList";case 25:return"TracingMarker";case 1:case 0:case 17:case 2:case 14:case 15:if(typeof t=="function")return t.displayName||t.name||null;if(typeof t=="string")return t}return null}function oe(e){switch(typeof e){case"boolean":case"number":case"string":case"undefined":return e;case"object":return e;default:return""}}function F(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()==="input"&&(t==="checkbox"||t==="radio")}function ne(e){var t=F(e)?"checked":"value",n=Object.getOwnPropertyDescriptor(e.constructor.prototype,t),r=""+e[t];if(!e.hasOwnProperty(t)&&typeof n<"u"&&typeof n.get=="function"&&typeof n.set=="function"){var o=n.get,u=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return o.call(this)},set:function(p){r=""+p,u.call(this,p)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(p){r=""+p},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function ke(e){e._valueTracker||(e._valueTracker=ne(e))}function Ce(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r="";return e&&(r=F(e)?e.checked?"true":"false":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function De(e){if(e=e||(typeof document<"u"?document:void 0),typeof e>"u")return null;try{return e.activeElement||e.body}catch{return e.body}}function Le(e,t){var n=t.checked;return G({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Fr(e,t){var n=t.defaultValue==null?"":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=oe(t.value!=null?t.value:n),e._wrapperState={initialChecked:r,initialValue:n,controlled:t.type==="checkbox"||t.type==="radio"?t.checked!=null:t.value!=null}}function Ur(e,t){t=t.checked,t!=null&&K(e,"checked",t,!1)}function wt(e,t){Ur(e,t);var n=oe(t.value),r=t.type;if(n!=null)r==="number"?(n===0&&e.value===""||e.value!=n)&&(e.value=""+n):e.value!==""+n&&(e.value=""+n);else if(r==="submit"||r==="reset"){e.removeAttribute("value");return}t.hasOwnProperty("value")?Mr(e,t.type,n):t.hasOwnProperty("defaultValue")&&Mr(e,t.type,oe(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function rr(e,t,n){if(t.hasOwnProperty("value")||t.hasOwnProperty("defaultValue")){var r=t.type;if(!(r!=="submit"&&r!=="reset"||t.value!==void 0&&t.value!==null))return;t=""+e._wrapperState.initialValue,n||t===e.value||(e.value=t),e.defaultValue=t}n=e.name,n!==""&&(e.name=""),e.defaultChecked=!!e._wrapperState.initialChecked,n!==""&&(e.name=n)}function Mr(e,t,n){(t!=="number"||De(e.ownerDocument)!==e)&&(n==null?e.defaultValue=""+e._wrapperState.initialValue:e.defaultValue!==""+n&&(e.defaultValue=""+n))}var On=Array.isArray;function an(e,t,n,r){if(e=e.options,t){t={};for(var o=0;o"+t.valueOf().toString()+"",t=sr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function zn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var An={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,zoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},va=["Webkit","ms","Moz","O"];Object.keys(An).forEach(function(e){va.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),An[t]=An[e]})});function Bs(e,t,n){return t==null||typeof t=="boolean"||t===""?"":n||typeof t!="number"||t===0||An.hasOwnProperty(e)&&An[e]?(""+t).trim():t+"px"}function Vs(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf("--")===0,o=Bs(n,t[n],r);n==="float"&&(n="cssFloat"),r?e.setProperty(n,o):e[n]=o}}var wa=G({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});function Br(e,t){if(t){if(wa[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(i(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(i(60));if(typeof t.dangerouslySetInnerHTML!="object"||!("__html"in t.dangerouslySetInnerHTML))throw Error(i(61))}if(t.style!=null&&typeof t.style!="object")throw Error(i(62))}}function on(e,t){if(e.indexOf("-")===-1)return typeof t.is=="string";switch(e){case"annotation-xml":case"color-profile":case"font-face":case"font-face-src":case"font-face-uri":case"font-face-format":case"font-face-name":case"missing-glyph":return!1;default:return!0}}var Vr=null;function Hr(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Wr=null,Qt=null,w=null;function $(e){if(e=ps(e)){if(typeof Wr!="function")throw Error(i(280));var t=e.stateNode;t&&(t=fl(t),Wr(e.stateNode,e.type,t))}}function ue(e){Qt?w?w.push(e):w=[e]:Qt=e}function Se(){if(Qt){var e=Qt,t=w;if(w=Qt=null,$(e),t)for(e=0;e>>=0,e===0?32:31-(np(e)/rp|0)|0}var Qs=64,Js=4194304;function Jr(e){switch(e&-e){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return e&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return e&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;default:return e}}function Gs(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,o=e.suspendedLanes,u=e.pingedLanes,p=n&268435455;if(p!==0){var g=p&~o;g!==0?r=Jr(g):(u&=p,u!==0&&(r=Jr(u)))}else p=n&~o,p!==0?r=Jr(p):u!==0&&(r=Jr(u));if(r===0)return 0;if(t!==0&&t!==r&&(t&o)===0&&(o=r&-r,u=t&-t,o>=u||o===16&&(u&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0n;n++)t.push(e);return t}function Gr(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-Lt(t),e[t]=n}function ip(e,t){var n=e.pendingLanes&~t;e.pendingLanes=t,e.suspendedLanes=0,e.pingedLanes=0,e.expiredLanes&=t,e.mutableReadLanes&=t,e.entangledLanes&=t,t=e.entanglements;var r=e.eventTimes;for(e=e.expirationTimes;0=ss),du=" ",fu=!1;function pu(e,t){switch(e){case"keyup":return Ap.indexOf(t.keyCode)!==-1;case"keydown":return t.keyCode!==229;case"keypress":case"mousedown":case"focusout":return!0;default:return!1}}function mu(e){return e=e.detail,typeof e=="object"&&"data"in e?e.data:null}var or=!1;function Fp(e,t){switch(e){case"compositionend":return mu(t);case"keypress":return t.which!==32?null:(fu=!0,du);case"textInput":return e=t.data,e===du&&fu?null:e;default:return null}}function Up(e,t){if(or)return e==="compositionend"||!Da&&pu(e,t)?(e=lu(),tl=Ra=mn=null,or=!1,e):null;switch(e){case"paste":return null;case"keypress":if(!(t.ctrlKey||t.altKey||t.metaKey)||t.ctrlKey&&t.altKey){if(t.char&&1=t)return{node:n,offset:t-e};e=r}e:{for(;n;){if(n.nextSibling){n=n.nextSibling;break e}n=n.parentNode}n=void 0}n=ku(n)}}function Nu(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?Nu(e,t.parentNode):"contains"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Su(){for(var e=window,t=De();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href=="string"}catch{n=!1}if(n)e=t.contentWindow;else break;t=De(e.document)}return t}function Ma(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t&&(t==="input"&&(e.type==="text"||e.type==="search"||e.type==="tel"||e.type==="url"||e.type==="password")||t==="textarea"||e.contentEditable==="true")}function Kp(e){var t=Su(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&Nu(n.ownerDocument.documentElement,n)){if(r!==null&&Ma(n)){if(t=r.start,e=r.end,e===void 0&&(e=t),"selectionStart"in n)n.selectionStart=t,n.selectionEnd=Math.min(e,n.value.length);else if(e=(t=n.ownerDocument||document)&&t.defaultView||window,e.getSelection){e=e.getSelection();var o=n.textContent.length,u=Math.min(r.start,o);r=r.end===void 0?u:Math.min(r.end,o),!e.extend&&u>r&&(o=r,r=u,u=o),o=ju(n,u);var p=ju(n,r);o&&p&&(e.rangeCount!==1||e.anchorNode!==o.node||e.anchorOffset!==o.offset||e.focusNode!==p.node||e.focusOffset!==p.offset)&&(t=t.createRange(),t.setStart(o.node,o.offset),e.removeAllRanges(),u>r?(e.addRange(t),e.extend(p.node,p.offset)):(t.setEnd(p.node,p.offset),e.addRange(t)))}}for(t=[],e=n;e=e.parentNode;)e.nodeType===1&&t.push({element:e,left:e.scrollLeft,top:e.scrollTop});for(typeof n.focus=="function"&&n.focus(),n=0;n=document.documentMode,ur=null,Ia=null,os=null,$a=!1;function bu(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;$a||ur==null||ur!==De(r)||(r=ur,"selectionStart"in r&&Ma(r)?r={start:r.selectionStart,end:r.selectionEnd}:(r=(r.ownerDocument&&r.ownerDocument.defaultView||window).getSelection(),r={anchorNode:r.anchorNode,anchorOffset:r.anchorOffset,focusNode:r.focusNode,focusOffset:r.focusOffset}),os&&is(os,r)||(os=r,r=ul(Ia,"onSelect"),0mr||(e.current=Za[mr],Za[mr]=null,mr--)}function Fe(e,t){mr++,Za[mr]=e.current,e.current=t}var yn={},st=gn(yn),ft=gn(!1),Un=yn;function hr(e,t){var n=e.type.contextTypes;if(!n)return yn;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var o={},u;for(u in n)o[u]=t[u];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=o),o}function pt(e){return e=e.childContextTypes,e!=null}function pl(){Me(ft),Me(st)}function Iu(e,t,n){if(st.current!==yn)throw Error(i(168));Fe(st,t),Fe(ft,n)}function $u(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!="function")return n;r=r.getChildContext();for(var o in r)if(!(o in t))throw Error(i(108,we(e)||"Unknown",o));return G({},n,r)}function ml(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||yn,Un=st.current,Fe(st,e),Fe(ft,ft.current),!0}function Bu(e,t,n){var r=e.stateNode;if(!r)throw Error(i(169));n?(e=$u(e,t,Un),r.__reactInternalMemoizedMergedChildContext=e,Me(ft),Me(st),Fe(st,e)):Me(ft),Fe(ft,n)}var Gt=null,hl=!1,ei=!1;function Vu(e){Gt===null?Gt=[e]:Gt.push(e)}function lm(e){hl=!0,Vu(e)}function vn(){if(!ei&&Gt!==null){ei=!0;var e=0,t=Oe;try{var n=Gt;for(Oe=1;e>=p,o-=p,Yt=1<<32-Lt(t)+o|n<ve?(tt=xe,xe=null):tt=xe.sibling;var Re=V(E,xe,R[ve],J);if(Re===null){xe===null&&(xe=tt);break}e&&xe&&Re.alternate===null&&t(E,xe),S=u(Re,S,ve),he===null?ce=Re:he.sibling=Re,he=Re,xe=tt}if(ve===R.length)return n(E,xe),Ie&&In(E,ve),ce;if(xe===null){for(;veve?(tt=xe,xe=null):tt=xe.sibling;var En=V(E,xe,Re.value,J);if(En===null){xe===null&&(xe=tt);break}e&&xe&&En.alternate===null&&t(E,xe),S=u(En,S,ve),he===null?ce=En:he.sibling=En,he=En,xe=tt}if(Re.done)return n(E,xe),Ie&&In(E,ve),ce;if(xe===null){for(;!Re.done;ve++,Re=R.next())Re=W(E,Re.value,J),Re!==null&&(S=u(Re,S,ve),he===null?ce=Re:he.sibling=Re,he=Re);return Ie&&In(E,ve),ce}for(xe=r(E,xe);!Re.done;ve++,Re=R.next())Re=Z(xe,E,ve,Re.value,J),Re!==null&&(e&&Re.alternate!==null&&xe.delete(Re.key===null?ve:Re.key),S=u(Re,S,ve),he===null?ce=Re:he.sibling=Re,he=Re);return e&&xe.forEach(function(Mm){return t(E,Mm)}),Ie&&In(E,ve),ce}function Qe(E,S,R,J){if(typeof R=="object"&&R!==null&&R.type===z&&R.key===null&&(R=R.props.children),typeof R=="object"&&R!==null){switch(R.$$typeof){case me:e:{for(var ce=R.key,he=S;he!==null;){if(he.key===ce){if(ce=R.type,ce===z){if(he.tag===7){n(E,he.sibling),S=o(he,R.props.children),S.return=E,E=S;break e}}else if(he.elementType===ce||typeof ce=="object"&&ce!==null&&ce.$$typeof===ge&&Ju(ce)===he.type){n(E,he.sibling),S=o(he,R.props),S.ref=ms(E,he,R),S.return=E,E=S;break e}n(E,he);break}else t(E,he);he=he.sibling}R.type===z?(S=Qn(R.props.children,E.mode,J,R.key),S.return=E,E=S):(J=Vl(R.type,R.key,R.props,null,E.mode,J),J.ref=ms(E,S,R),J.return=E,E=J)}return p(E);case fe:e:{for(he=R.key;S!==null;){if(S.key===he)if(S.tag===4&&S.stateNode.containerInfo===R.containerInfo&&S.stateNode.implementation===R.implementation){n(E,S.sibling),S=o(S,R.children||[]),S.return=E,E=S;break e}else{n(E,S);break}else t(E,S);S=S.sibling}S=Yi(R,E.mode,J),S.return=E,E=S}return p(E);case ge:return he=R._init,Qe(E,S,he(R._payload),J)}if(On(R))return se(E,S,R,J);if(ee(R))return ie(E,S,R,J);vl(E,R)}return typeof R=="string"&&R!==""||typeof R=="number"?(R=""+R,S!==null&&S.tag===6?(n(E,S.sibling),S=o(S,R),S.return=E,E=S):(n(E,S),S=Gi(R,E.mode,J),S.return=E,E=S),p(E)):n(E,S)}return Qe}var vr=Gu(!0),Yu=Gu(!1),wl=gn(null),kl=null,wr=null,ai=null;function ii(){ai=wr=kl=null}function oi(e){var t=wl.current;Me(wl),e._currentValue=t}function ui(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function kr(e,t){kl=e,ai=wr=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(mt=!0),e.firstContext=null)}function _t(e){var t=e._currentValue;if(ai!==e)if(e={context:e,memoizedValue:t,next:null},wr===null){if(kl===null)throw Error(i(308));wr=e,kl.dependencies={lanes:0,firstContext:e}}else wr=wr.next=e;return t}var $n=null;function ci(e){$n===null?$n=[e]:$n.push(e)}function Xu(e,t,n,r){var o=t.interleaved;return o===null?(n.next=n,ci(t)):(n.next=o.next,o.next=n),t.interleaved=n,Zt(e,r)}function Zt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var wn=!1;function di(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function Zu(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function en(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function kn(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(Pe&2)!==0){var o=r.pending;return o===null?t.next=t:(t.next=o.next,o.next=t),r.pending=t,Zt(e,n)}return o=r.interleaved,o===null?(t.next=t,ci(r)):(t.next=o.next,o.next=t),r.interleaved=t,Zt(e,n)}function jl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ba(e,n)}}function ec(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var o=null,u=null;if(n=n.firstBaseUpdate,n!==null){do{var p={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};u===null?o=u=p:u=u.next=p,n=n.next}while(n!==null);u===null?o=u=t:u=u.next=t}else o=u=t;n={baseState:r.baseState,firstBaseUpdate:o,lastBaseUpdate:u,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function Nl(e,t,n,r){var o=e.updateQueue;wn=!1;var u=o.firstBaseUpdate,p=o.lastBaseUpdate,g=o.shared.pending;if(g!==null){o.shared.pending=null;var k=g,T=k.next;k.next=null,p===null?u=T:p.next=T,p=k;var H=e.alternate;H!==null&&(H=H.updateQueue,g=H.lastBaseUpdate,g!==p&&(g===null?H.firstBaseUpdate=T:g.next=T,H.lastBaseUpdate=k))}if(u!==null){var W=o.baseState;p=0,H=T=k=null,g=u;do{var V=g.lane,Z=g.eventTime;if((r&V)===V){H!==null&&(H=H.next={eventTime:Z,lane:0,tag:g.tag,payload:g.payload,callback:g.callback,next:null});e:{var se=e,ie=g;switch(V=t,Z=n,ie.tag){case 1:if(se=ie.payload,typeof se=="function"){W=se.call(Z,W,V);break e}W=se;break e;case 3:se.flags=se.flags&-65537|128;case 0:if(se=ie.payload,V=typeof se=="function"?se.call(Z,W,V):se,V==null)break e;W=G({},W,V);break e;case 2:wn=!0}}g.callback!==null&&g.lane!==0&&(e.flags|=64,V=o.effects,V===null?o.effects=[g]:V.push(g))}else Z={eventTime:Z,lane:V,tag:g.tag,payload:g.payload,callback:g.callback,next:null},H===null?(T=H=Z,k=W):H=H.next=Z,p|=V;if(g=g.next,g===null){if(g=o.shared.pending,g===null)break;V=g,g=V.next,V.next=null,o.lastBaseUpdate=V,o.shared.pending=null}}while(!0);if(H===null&&(k=W),o.baseState=k,o.firstBaseUpdate=T,o.lastBaseUpdate=H,t=o.shared.interleaved,t!==null){o=t;do p|=o.lane,o=o.next;while(o!==t)}else u===null&&(o.shared.lanes=0);Hn|=p,e.lanes=p,e.memoizedState=W}}function tc(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;tn?n:4,e(!0);var r=xi.transition;xi.transition={};try{e(!1),t()}finally{Oe=n,xi.transition=r}}function wc(){return Et().memoizedState}function um(e,t,n){var r=bn(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},kc(e))jc(t,n);else if(n=Xu(e,t,n,r),n!==null){var o=ct();Ut(n,e,r,o),Nc(n,t,r)}}function cm(e,t,n){var r=bn(e),o={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(kc(e))jc(t,o);else{var u=e.alternate;if(e.lanes===0&&(u===null||u.lanes===0)&&(u=t.lastRenderedReducer,u!==null))try{var p=t.lastRenderedState,g=u(p,n);if(o.hasEagerState=!0,o.eagerState=g,Ot(g,p)){var k=t.interleaved;k===null?(o.next=o,ci(t)):(o.next=k.next,k.next=o),t.interleaved=o;return}}catch{}finally{}n=Xu(e,t,o,r),n!==null&&(o=ct(),Ut(n,e,r,o),Nc(n,t,r))}}function kc(e){var t=e.alternate;return e===Ve||t!==null&&t===Ve}function jc(e,t){ys=Cl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function Nc(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,ba(e,n)}}var Pl={readContext:_t,useCallback:lt,useContext:lt,useEffect:lt,useImperativeHandle:lt,useInsertionEffect:lt,useLayoutEffect:lt,useMemo:lt,useReducer:lt,useRef:lt,useState:lt,useDebugValue:lt,useDeferredValue:lt,useTransition:lt,useMutableSource:lt,useSyncExternalStore:lt,useId:lt,unstable_isNewReconciler:!1},dm={readContext:_t,useCallback:function(e,t){return Wt().memoizedState=[e,t===void 0?null:t],e},useContext:_t,useEffect:fc,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,_l(4194308,4,hc.bind(null,t,e),n)},useLayoutEffect:function(e,t){return _l(4194308,4,e,t)},useInsertionEffect:function(e,t){return _l(4,2,e,t)},useMemo:function(e,t){var n=Wt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=Wt();return t=n!==void 0?n(t):t,r.memoizedState=r.baseState=t,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:e,lastRenderedState:t},r.queue=e,e=e.dispatch=um.bind(null,Ve,e),[r.memoizedState,e]},useRef:function(e){var t=Wt();return e={current:e},t.memoizedState=e},useState:cc,useDebugValue:Ni,useDeferredValue:function(e){return Wt().memoizedState=e},useTransition:function(){var e=cc(!1),t=e[0];return e=om.bind(null,e[1]),Wt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=Ve,o=Wt();if(Ie){if(n===void 0)throw Error(i(407));n=n()}else{if(n=t(),et===null)throw Error(i(349));(Vn&30)!==0||lc(r,t,n)}o.memoizedState=n;var u={value:n,getSnapshot:t};return o.queue=u,fc(ic.bind(null,r,u,e),[e]),r.flags|=2048,ks(9,ac.bind(null,r,u,n,t),void 0,null),n},useId:function(){var e=Wt(),t=et.identifierPrefix;if(Ie){var n=Xt,r=Yt;n=(r&~(1<<32-Lt(r)-1)).toString(32)+n,t=":"+t+"R"+n,n=vs++,0<\/script>",e=e.removeChild(e.firstChild)):typeof r.is=="string"?e=p.createElement(n,{is:r.is}):(e=p.createElement(n),n==="select"&&(p=e,r.multiple?p.multiple=!0:r.size&&(p.size=r.size))):e=p.createElementNS(e,n),e[Vt]=t,e[fs]=r,Vc(e,t,!1,!1),t.stateNode=e;e:{switch(p=on(n,r),n){case"dialog":Ue("cancel",e),Ue("close",e),o=r;break;case"iframe":case"object":case"embed":Ue("load",e),o=r;break;case"video":case"audio":for(o=0;oCr&&(t.flags|=128,r=!0,js(u,!1),t.lanes=4194304)}else{if(!r)if(e=Sl(p),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),js(u,!0),u.tail===null&&u.tailMode==="hidden"&&!p.alternate&&!Ie)return at(t),null}else 2*Ke()-u.renderingStartTime>Cr&&n!==1073741824&&(t.flags|=128,r=!0,js(u,!1),t.lanes=4194304);u.isBackwards?(p.sibling=t.child,t.child=p):(n=u.last,n!==null?n.sibling=p:t.child=p,u.last=p)}return u.tail!==null?(t=u.tail,u.rendering=t,u.tail=t.sibling,u.renderingStartTime=Ke(),t.sibling=null,n=Be.current,Fe(Be,r?n&1|2:n&1),t):(at(t),null);case 22:case 23:return Ki(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(St&1073741824)!==0&&(at(t),t.subtreeFlags&6&&(t.flags|=8192)):at(t),null;case 24:return null;case 25:return null}throw Error(i(156,t.tag))}function vm(e,t){switch(ni(t),t.tag){case 1:return pt(t.type)&&pl(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return jr(),Me(ft),Me(st),hi(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return pi(t),null;case 13:if(Me(Be),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(i(340));yr()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return Me(Be),null;case 4:return jr(),null;case 10:return oi(t.type._context),null;case 22:case 23:return Ki(),null;case 24:return null;default:return null}}var Ol=!1,it=!1,wm=typeof WeakSet=="function"?WeakSet:Set,re=null;function Sr(e,t){var n=e.ref;if(n!==null)if(typeof n=="function")try{n(null)}catch(r){We(e,t,r)}else n.current=null}function Ai(e,t,n){try{n()}catch(r){We(e,t,r)}}var qc=!1;function km(e,t){if(Ka=Zs,e=Su(),Ma(e)){if("selectionStart"in e)var n={start:e.selectionStart,end:e.selectionEnd};else e:{n=(n=e.ownerDocument)&&n.defaultView||window;var r=n.getSelection&&n.getSelection();if(r&&r.rangeCount!==0){n=r.anchorNode;var o=r.anchorOffset,u=r.focusNode;r=r.focusOffset;try{n.nodeType,u.nodeType}catch{n=null;break e}var p=0,g=-1,k=-1,T=0,H=0,W=e,V=null;t:for(;;){for(var Z;W!==n||o!==0&&W.nodeType!==3||(g=p+o),W!==u||r!==0&&W.nodeType!==3||(k=p+r),W.nodeType===3&&(p+=W.nodeValue.length),(Z=W.firstChild)!==null;)V=W,W=Z;for(;;){if(W===e)break t;if(V===n&&++T===o&&(g=p),V===u&&++H===r&&(k=p),(Z=W.nextSibling)!==null)break;W=V,V=W.parentNode}W=Z}n=g===-1||k===-1?null:{start:g,end:k}}else n=null}n=n||{start:0,end:0}}else n=null;for(Qa={focusedElem:e,selectionRange:n},Zs=!1,re=t;re!==null;)if(t=re,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,re=e;else for(;re!==null;){t=re;try{var se=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(se!==null){var ie=se.memoizedProps,Qe=se.memoizedState,E=t.stateNode,S=E.getSnapshotBeforeUpdate(t.elementType===t.type?ie:At(t.type,ie),Qe);E.__reactInternalSnapshotBeforeUpdate=S}break;case 3:var R=t.stateNode.containerInfo;R.nodeType===1?R.textContent="":R.nodeType===9&&R.documentElement&&R.removeChild(R.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(i(163))}}catch(J){We(t,t.return,J)}if(e=t.sibling,e!==null){e.return=t.return,re=e;break}re=t.return}return se=qc,qc=!1,se}function Ns(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var o=r=r.next;do{if((o.tag&e)===e){var u=o.destroy;o.destroy=void 0,u!==void 0&&Ai(t,n,u)}o=o.next}while(o!==r)}}function zl(e,t){if(t=t.updateQueue,t=t!==null?t.lastEffect:null,t!==null){var n=t=t.next;do{if((n.tag&e)===e){var r=n.create;n.destroy=r()}n=n.next}while(n!==t)}}function Di(e){var t=e.ref;if(t!==null){var n=e.stateNode;switch(e.tag){case 5:e=n;break;default:e=n}typeof t=="function"?t(e):t.current=e}}function Kc(e){var t=e.alternate;t!==null&&(e.alternate=null,Kc(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[Vt],delete t[fs],delete t[Xa],delete t[rm],delete t[sm])),e.stateNode=null,e.return=null,e.dependencies=null,e.memoizedProps=null,e.memoizedState=null,e.pendingProps=null,e.stateNode=null,e.updateQueue=null}function Qc(e){return e.tag===5||e.tag===3||e.tag===4}function Jc(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||Qc(e.return))return null;e=e.return}for(e.sibling.return=e.return,e=e.sibling;e.tag!==5&&e.tag!==6&&e.tag!==18;){if(e.flags&2||e.child===null||e.tag===4)continue e;e.child.return=e,e=e.child}if(!(e.flags&2))return e.stateNode}}function Fi(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.nodeType===8?n.parentNode.insertBefore(e,t):n.insertBefore(e,t):(n.nodeType===8?(t=n.parentNode,t.insertBefore(e,n)):(t=n,t.appendChild(e)),n=n._reactRootContainer,n!=null||t.onclick!==null||(t.onclick=dl));else if(r!==4&&(e=e.child,e!==null))for(Fi(e,t,n),e=e.sibling;e!==null;)Fi(e,t,n),e=e.sibling}function Ui(e,t,n){var r=e.tag;if(r===5||r===6)e=e.stateNode,t?n.insertBefore(e,t):n.appendChild(e);else if(r!==4&&(e=e.child,e!==null))for(Ui(e,t,n),e=e.sibling;e!==null;)Ui(e,t,n),e=e.sibling}var nt=null,Dt=!1;function jn(e,t,n){for(n=n.child;n!==null;)Gc(e,t,n),n=n.sibling}function Gc(e,t,n){if(Bt&&typeof Bt.onCommitFiberUnmount=="function")try{Bt.onCommitFiberUnmount(Ks,n)}catch{}switch(n.tag){case 5:it||Sr(n,t);case 6:var r=nt,o=Dt;nt=null,jn(e,t,n),nt=r,Dt=o,nt!==null&&(Dt?(e=nt,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):nt.removeChild(n.stateNode));break;case 18:nt!==null&&(Dt?(e=nt,n=n.stateNode,e.nodeType===8?Ya(e.parentNode,n):e.nodeType===1&&Ya(e,n),ts(e)):Ya(nt,n.stateNode));break;case 4:r=nt,o=Dt,nt=n.stateNode.containerInfo,Dt=!0,jn(e,t,n),nt=r,Dt=o;break;case 0:case 11:case 14:case 15:if(!it&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){o=r=r.next;do{var u=o,p=u.destroy;u=u.tag,p!==void 0&&((u&2)!==0||(u&4)!==0)&&Ai(n,t,p),o=o.next}while(o!==r)}jn(e,t,n);break;case 1:if(!it&&(Sr(n,t),r=n.stateNode,typeof r.componentWillUnmount=="function"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(g){We(n,t,g)}jn(e,t,n);break;case 21:jn(e,t,n);break;case 22:n.mode&1?(it=(r=it)||n.memoizedState!==null,jn(e,t,n),it=r):jn(e,t,n);break;default:jn(e,t,n)}}function Yc(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new wm),t.forEach(function(r){var o=Rm.bind(null,e,r);n.has(r)||(n.add(r),r.then(o,o))})}}function Ft(e,t){var n=t.deletions;if(n!==null)for(var r=0;ro&&(o=p),r&=~u}if(r=o,r=Ke()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Nm(r/1960))-r,10e?16:e,Sn===null)var r=!1;else{if(e=Sn,Sn=null,Ml=0,(Pe&6)!==0)throw Error(i(331));var o=Pe;for(Pe|=4,re=e.current;re!==null;){var u=re,p=u.child;if((re.flags&16)!==0){var g=u.deletions;if(g!==null){for(var k=0;kKe()-$i?qn(e,0):Ii|=n),xt(e,t)}function cd(e,t){t===0&&((e.mode&1)===0?t=1:(t=Js,Js<<=1,(Js&130023424)===0&&(Js=4194304)));var n=ct();e=Zt(e,t),e!==null&&(Gr(e,t,n),xt(e,n))}function Pm(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),cd(e,n)}function Rm(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,o=e.memoizedState;o!==null&&(n=o.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(i(314))}r!==null&&r.delete(t),cd(e,n)}var dd;dd=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||ft.current)mt=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return mt=!1,gm(e,t,n);mt=(e.flags&131072)!==0}else mt=!1,Ie&&(t.flags&1048576)!==0&&Hu(t,gl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;Ll(e,t),e=t.pendingProps;var o=hr(t,st.current);kr(t,n),o=yi(null,t,r,e,o,n);var u=vi();return t.flags|=1,typeof o=="object"&&o!==null&&typeof o.render=="function"&&o.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,pt(r)?(u=!0,ml(t)):u=!1,t.memoizedState=o.state!==null&&o.state!==void 0?o.state:null,di(t),o.updater=Rl,t.stateNode=o,o._reactInternals=t,bi(t,r,e,n),t=Pi(null,t,r,!0,u,n)):(t.tag=0,Ie&&u&&ti(t),ut(null,t,o,n),t=t.child),t;case 16:r=t.elementType;e:{switch(Ll(e,t),e=t.pendingProps,o=r._init,r=o(r._payload),t.type=r,o=t.tag=Lm(r),e=At(r,e),o){case 0:t=Ei(null,t,r,e,n);break e;case 1:t=Fc(null,t,r,e,n);break e;case 11:t=Lc(null,t,r,e,n);break e;case 14:t=Oc(null,t,r,At(r.type,e),n);break e}throw Error(i(306,r,""))}return t;case 0:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:At(r,o),Ei(e,t,r,o,n);case 1:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:At(r,o),Fc(e,t,r,o,n);case 3:e:{if(Uc(t),e===null)throw Error(i(387));r=t.pendingProps,u=t.memoizedState,o=u.element,Zu(e,t),Nl(t,r,null,n);var p=t.memoizedState;if(r=p.element,u.isDehydrated)if(u={element:r,isDehydrated:!1,cache:p.cache,pendingSuspenseBoundaries:p.pendingSuspenseBoundaries,transitions:p.transitions},t.updateQueue.baseState=u,t.memoizedState=u,t.flags&256){o=Nr(Error(i(423)),t),t=Mc(e,t,r,n,o);break e}else if(r!==o){o=Nr(Error(i(424)),t),t=Mc(e,t,r,n,o);break e}else for(Nt=xn(t.stateNode.containerInfo.firstChild),jt=t,Ie=!0,zt=null,n=Yu(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(yr(),r===o){t=tn(e,t,n);break e}ut(e,t,r,n)}t=t.child}return t;case 5:return nc(t),e===null&&si(t),r=t.type,o=t.pendingProps,u=e!==null?e.memoizedProps:null,p=o.children,Ja(r,o)?p=null:u!==null&&Ja(r,u)&&(t.flags|=32),Dc(e,t),ut(e,t,p,n),t.child;case 6:return e===null&&si(t),null;case 13:return Ic(e,t,n);case 4:return fi(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=vr(t,null,r,n):ut(e,t,r,n),t.child;case 11:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:At(r,o),Lc(e,t,r,o,n);case 7:return ut(e,t,t.pendingProps,n),t.child;case 8:return ut(e,t,t.pendingProps.children,n),t.child;case 12:return ut(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,o=t.pendingProps,u=t.memoizedProps,p=o.value,Fe(wl,r._currentValue),r._currentValue=p,u!==null)if(Ot(u.value,p)){if(u.children===o.children&&!ft.current){t=tn(e,t,n);break e}}else for(u=t.child,u!==null&&(u.return=t);u!==null;){var g=u.dependencies;if(g!==null){p=u.child;for(var k=g.firstContext;k!==null;){if(k.context===r){if(u.tag===1){k=en(-1,n&-n),k.tag=2;var T=u.updateQueue;if(T!==null){T=T.shared;var H=T.pending;H===null?k.next=k:(k.next=H.next,H.next=k),T.pending=k}}u.lanes|=n,k=u.alternate,k!==null&&(k.lanes|=n),ui(u.return,n,t),g.lanes|=n;break}k=k.next}}else if(u.tag===10)p=u.type===t.type?null:u.child;else if(u.tag===18){if(p=u.return,p===null)throw Error(i(341));p.lanes|=n,g=p.alternate,g!==null&&(g.lanes|=n),ui(p,n,t),p=u.sibling}else p=u.child;if(p!==null)p.return=u;else for(p=u;p!==null;){if(p===t){p=null;break}if(u=p.sibling,u!==null){u.return=p.return,p=u;break}p=p.return}u=p}ut(e,t,o.children,n),t=t.child}return t;case 9:return o=t.type,r=t.pendingProps.children,kr(t,n),o=_t(o),r=r(o),t.flags|=1,ut(e,t,r,n),t.child;case 14:return r=t.type,o=At(r,t.pendingProps),o=At(r.type,o),Oc(e,t,r,o,n);case 15:return zc(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,o=t.pendingProps,o=t.elementType===r?o:At(r,o),Ll(e,t),t.tag=1,pt(r)?(e=!0,ml(t)):e=!1,kr(t,n),bc(t,r,o),bi(t,r,o,n),Pi(null,t,r,!0,e,n);case 19:return Bc(e,t,n);case 22:return Ac(e,t,n)}throw Error(i(156,t.tag))};function fd(e,t){return Wo(e,t)}function Tm(e,t,n,r){this.tag=e,this.key=n,this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null,this.index=0,this.ref=null,this.pendingProps=t,this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null,this.mode=r,this.subtreeFlags=this.flags=0,this.deletions=null,this.childLanes=this.lanes=0,this.alternate=null}function Rt(e,t,n,r){return new Tm(e,t,n,r)}function Ji(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Lm(e){if(typeof e=="function")return Ji(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Te)return 11;if(e===q)return 14}return 2}function _n(e,t){var n=e.alternate;return n===null?(n=Rt(e.tag,t,e.key,e.mode),n.elementType=e.elementType,n.type=e.type,n.stateNode=e.stateNode,n.alternate=e,e.alternate=n):(n.pendingProps=t,n.type=e.type,n.flags=0,n.subtreeFlags=0,n.deletions=null),n.flags=e.flags&14680064,n.childLanes=e.childLanes,n.lanes=e.lanes,n.child=e.child,n.memoizedProps=e.memoizedProps,n.memoizedState=e.memoizedState,n.updateQueue=e.updateQueue,t=e.dependencies,n.dependencies=t===null?null:{lanes:t.lanes,firstContext:t.firstContext},n.sibling=e.sibling,n.index=e.index,n.ref=e.ref,n}function Vl(e,t,n,r,o,u){var p=2;if(r=e,typeof e=="function")Ji(e)&&(p=1);else if(typeof e=="string")p=5;else e:switch(e){case z:return Qn(n.children,o,u,t);case ae:p=8,o|=8;break;case de:return e=Rt(12,n,t,o|2),e.elementType=de,e.lanes=u,e;case ze:return e=Rt(13,n,t,o),e.elementType=ze,e.lanes=u,e;case Ee:return e=Rt(19,n,t,o),e.elementType=Ee,e.lanes=u,e;case D:return Hl(n,o,u,t);default:if(typeof e=="object"&&e!==null)switch(e.$$typeof){case Y:p=10;break e;case je:p=9;break e;case Te:p=11;break e;case q:p=14;break e;case ge:p=16,r=null;break e}throw Error(i(130,e==null?e:typeof e,""))}return t=Rt(p,n,t,o),t.elementType=e,t.type=r,t.lanes=u,t}function Qn(e,t,n,r){return e=Rt(7,e,r,t),e.lanes=n,e}function Hl(e,t,n,r){return e=Rt(22,e,r,t),e.elementType=D,e.lanes=n,e.stateNode={isHidden:!1},e}function Gi(e,t,n){return e=Rt(6,e,null,t),e.lanes=n,e}function Yi(e,t,n){return t=Rt(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Om(e,t,n,r,o){this.tag=t,this.containerInfo=e,this.finishedWork=this.pingCache=this.current=this.pendingChildren=null,this.timeoutHandle=-1,this.callbackNode=this.pendingContext=this.context=null,this.callbackPriority=0,this.eventTimes=Sa(0),this.expirationTimes=Sa(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=Sa(0),this.identifierPrefix=r,this.onRecoverableError=o,this.mutableSourceEagerHydrationData=null}function Xi(e,t,n,r,o,u,p,g,k){return e=new Om(e,t,n,g,k),t===1?(t=1,u===!0&&(t|=8)):t=0,u=Rt(3,null,null,t),e.current=u,u.stateNode=e,u.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},di(u),e}function zm(e,t,n){var r=3"u"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!="function"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(s)}catch(a){console.error(a)}}return s(),so.exports=Km(),so.exports}var Cd;function Qm(){if(Cd)return Yl;Cd=1;var s=sf();return Yl.createRoot=s.createRoot,Yl.hydrateRoot=s.hydrateRoot,Yl}var Jm=Qm();const Gm=nf(Jm);sf();/** + * @remix-run/router v1.23.2 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Rs(){return Rs=Object.assign?Object.assign.bind():function(s){for(var a=1;a"u")throw new Error(a)}function To(s,a){if(!s){typeof console<"u"&&console.warn(a);try{throw new Error(a)}catch{}}}function Xm(){return Math.random().toString(36).substr(2,8)}function Ed(s,a){return{usr:s.state,key:s.key,idx:a}}function go(s,a,i,c){return i===void 0&&(i=null),Rs({pathname:typeof s=="string"?s:s.pathname,search:"",hash:""},typeof a=="string"?Or(a):a,{state:i,key:a&&a.key||c||Xm()})}function sa(s){let{pathname:a="/",search:i="",hash:c=""}=s;return i&&i!=="?"&&(a+=i.charAt(0)==="?"?i:"?"+i),c&&c!=="#"&&(a+=c.charAt(0)==="#"?c:"#"+c),a}function Or(s){let a={};if(s){let i=s.indexOf("#");i>=0&&(a.hash=s.substr(i),s=s.substr(0,i));let c=s.indexOf("?");c>=0&&(a.search=s.substr(c),s=s.substr(0,c)),s&&(a.pathname=s)}return a}function Zm(s,a,i,c){c===void 0&&(c={});let{window:d=document.defaultView,v5Compat:f=!1}=c,m=d.history,h=Rn.Pop,x=null,y=j();y==null&&(y=0,m.replaceState(Rs({},m.state,{idx:y}),""));function j(){return(m.state||{idx:null}).idx}function _(){h=Rn.Pop;let N=j(),A=N==null?null:N-y;y=N,x&&x({action:h,location:P.location,delta:A})}function O(N,A){h=Rn.Push;let M=go(P.location,N,A);y=j()+1;let K=Ed(M,y),Q=P.createHref(M);try{m.pushState(K,"",Q)}catch(me){if(me instanceof DOMException&&me.name==="DataCloneError")throw me;d.location.assign(Q)}f&&x&&x({action:h,location:P.location,delta:1})}function B(N,A){h=Rn.Replace;let M=go(P.location,N,A);y=j();let K=Ed(M,y),Q=P.createHref(M);m.replaceState(K,"",Q),f&&x&&x({action:h,location:P.location,delta:0})}function L(N){let A=d.location.origin!=="null"?d.location.origin:d.location.href,M=typeof N=="string"?N:sa(N);return M=M.replace(/ $/,"%20"),He(A,"No window.location.(origin|href) available to create URL for href: "+M),new URL(M,A)}let P={get action(){return h},get location(){return s(d,m)},listen(N){if(x)throw new Error("A history only accepts one active listener");return d.addEventListener(_d,_),x=N,()=>{d.removeEventListener(_d,_),x=null}},createHref(N){return a(d,N)},createURL:L,encodeLocation(N){let A=L(N);return{pathname:A.pathname,search:A.search,hash:A.hash}},push:O,replace:B,go(N){return m.go(N)}};return P}var Pd;(function(s){s.data="data",s.deferred="deferred",s.redirect="redirect",s.error="error"})(Pd||(Pd={}));function e0(s,a,i){return i===void 0&&(i="/"),t0(s,a,i)}function t0(s,a,i,c){let d=typeof a=="string"?Or(a):a,f=Rr(d.pathname||"/",i);if(f==null)return null;let m=lf(s);n0(m);let h=null;for(let x=0;h==null&&x{let x={relativePath:h===void 0?f.path||"":h,caseSensitive:f.caseSensitive===!0,childrenIndex:m,route:f};x.relativePath.startsWith("/")&&(He(x.relativePath.startsWith(c),'Absolute route path "'+x.relativePath+'" nested under path '+('"'+c+'" is not valid. An absolute child route path ')+"must start with the combined path of all its parent routes."),x.relativePath=x.relativePath.slice(c.length));let y=Tn([c,x.relativePath]),j=i.concat(x);f.children&&f.children.length>0&&(He(f.index!==!0,"Index routes must not have child routes. Please remove "+('all child routes from route path "'+y+'".')),lf(f.children,a,j,y)),!(f.path==null&&!f.index)&&a.push({path:y,score:u0(y,f.index),routesMeta:j})};return s.forEach((f,m)=>{var h;if(f.path===""||!((h=f.path)!=null&&h.includes("?")))d(f,m);else for(let x of af(f.path))d(f,m,x)}),a}function af(s){let a=s.split("/");if(a.length===0)return[];let[i,...c]=a,d=i.endsWith("?"),f=i.replace(/\?$/,"");if(c.length===0)return d?[f,""]:[f];let m=af(c.join("/")),h=[];return h.push(...m.map(x=>x===""?f:[f,x].join("/"))),d&&h.push(...m),h.map(x=>s.startsWith("/")&&x===""?"/":x)}function n0(s){s.sort((a,i)=>a.score!==i.score?i.score-a.score:c0(a.routesMeta.map(c=>c.childrenIndex),i.routesMeta.map(c=>c.childrenIndex)))}const r0=/^:[\w-]+$/,s0=3,l0=2,a0=1,i0=10,o0=-2,Rd=s=>s==="*";function u0(s,a){let i=s.split("/"),c=i.length;return i.some(Rd)&&(c+=o0),a&&(c+=l0),i.filter(d=>!Rd(d)).reduce((d,f)=>d+(r0.test(f)?s0:f===""?a0:i0),c)}function c0(s,a){return s.length===a.length&&s.slice(0,-1).every((c,d)=>c===a[d])?s[s.length-1]-a[a.length-1]:0}function d0(s,a,i){let{routesMeta:c}=s,d={},f="/",m=[];for(let h=0;h{let{paramName:O,isOptional:B}=j;if(O==="*"){let P=h[_]||"";m=f.slice(0,f.length-P.length).replace(/(.)\/+$/,"$1")}const L=h[_];return B&&!L?y[O]=void 0:y[O]=(L||"").replace(/%2F/g,"/"),y},{}),pathname:f,pathnameBase:m,pattern:s}}function f0(s,a,i){a===void 0&&(a=!1),i===void 0&&(i=!0),To(s==="*"||!s.endsWith("*")||s.endsWith("/*"),'Route path "'+s+'" will be treated as if it were '+('"'+s.replace(/\*$/,"/*")+'" because the `*` character must ')+"always follow a `/` in the pattern. To get rid of this warning, "+('please change the route path to "'+s.replace(/\*$/,"/*")+'".'));let c=[],d="^"+s.replace(/\/*\*?$/,"").replace(/^\/*/,"/").replace(/[\\.*+^${}|()[\]]/g,"\\$&").replace(/\/:([\w-]+)(\?)?/g,(m,h,x)=>(c.push({paramName:h,isOptional:x!=null}),x?"/?([^\\/]+)?":"/([^\\/]+)"));return s.endsWith("*")?(c.push({paramName:"*"}),d+=s==="*"||s==="/*"?"(.*)$":"(?:\\/(.+)|\\/*)$"):i?d+="\\/*$":s!==""&&s!=="/"&&(d+="(?:(?=\\/|$))"),[new RegExp(d,a?void 0:"i"),c]}function p0(s){try{return s.split("/").map(a=>decodeURIComponent(a).replace(/\//g,"%2F")).join("/")}catch(a){return To(!1,'The URL path "'+s+'" could not be decoded because it is is a malformed URL segment. This is probably due to a bad percent '+("encoding ("+a+").")),s}}function Rr(s,a){if(a==="/")return s;if(!s.toLowerCase().startsWith(a.toLowerCase()))return null;let i=a.endsWith("/")?a.length-1:a.length,c=s.charAt(i);return c&&c!=="/"?null:s.slice(i)||"/"}const m0=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,h0=s=>m0.test(s);function x0(s,a){a===void 0&&(a="/");let{pathname:i,search:c="",hash:d=""}=typeof s=="string"?Or(s):s,f;if(i)if(h0(i))f=i;else{if(i.includes("//")){let m=i;i=i.replace(/\/\/+/g,"/"),To(!1,"Pathnames cannot have embedded double slashes - normalizing "+(m+" -> "+i))}i.startsWith("/")?f=Td(i.substring(1),"/"):f=Td(i,a)}else f=a;return{pathname:f,search:v0(c),hash:w0(d)}}function Td(s,a){let i=a.replace(/\/+$/,"").split("/");return s.split("/").forEach(d=>{d===".."?i.length>1&&i.pop():d!=="."&&i.push(d)}),i.length>1?i.join("/"):"/"}function io(s,a,i,c){return"Cannot include a '"+s+"' character in a manually specified "+("`to."+a+"` field ["+JSON.stringify(c)+"]. Please separate it out to the ")+("`to."+i+"` field. Alternatively you may provide the full path as ")+'a string in and the router will parse it for you.'}function g0(s){return s.filter((a,i)=>i===0||a.route.path&&a.route.path.length>0)}function Lo(s,a){let i=g0(s);return a?i.map((c,d)=>d===i.length-1?c.pathname:c.pathnameBase):i.map(c=>c.pathnameBase)}function Oo(s,a,i,c){c===void 0&&(c=!1);let d;typeof s=="string"?d=Or(s):(d=Rs({},s),He(!d.pathname||!d.pathname.includes("?"),io("?","pathname","search",d)),He(!d.pathname||!d.pathname.includes("#"),io("#","pathname","hash",d)),He(!d.search||!d.search.includes("#"),io("#","search","hash",d)));let f=s===""||d.pathname==="",m=f?"/":d.pathname,h;if(m==null)h=i;else{let _=a.length-1;if(!c&&m.startsWith("..")){let O=m.split("/");for(;O[0]==="..";)O.shift(),_-=1;d.pathname=O.join("/")}h=_>=0?a[_]:"/"}let x=x0(d,h),y=m&&m!=="/"&&m.endsWith("/"),j=(f||m===".")&&i.endsWith("/");return!x.pathname.endsWith("/")&&(y||j)&&(x.pathname+="/"),x}const Tn=s=>s.join("/").replace(/\/\/+/g,"/"),y0=s=>s.replace(/\/+$/,"").replace(/^\/*/,"/"),v0=s=>!s||s==="?"?"":s.startsWith("?")?s:"?"+s,w0=s=>!s||s==="#"?"":s.startsWith("#")?s:"#"+s;function k0(s){return s!=null&&typeof s.status=="number"&&typeof s.statusText=="string"&&typeof s.internal=="boolean"&&"data"in s}const of=["post","put","patch","delete"];new Set(of);const j0=["get",...of];new Set(j0);/** + * React Router v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function Ts(){return Ts=Object.assign?Object.assign.bind():function(s){for(var a=1;a{h.current=!0}),v.useCallback(function(y,j){if(j===void 0&&(j={}),!h.current)return;if(typeof y=="number"){c.go(y);return}let _=Oo(y,JSON.parse(m),f,j.relative==="path");s==null&&a!=="/"&&(_.pathname=_.pathname==="/"?a:Tn([a,_.pathname])),(j.replace?c.replace:c.push)(_,j.state,j)},[a,c,m,f,s])}const b0=v.createContext(null);function C0(s){let a=v.useContext(ln).outlet;return a&&v.createElement(b0.Provider,{value:s},a)}function da(s,a){let{relative:i}=a===void 0?{}:a,{future:c}=v.useContext(sn),{matches:d}=v.useContext(ln),{pathname:f}=Ar(),m=JSON.stringify(Lo(d,c.v7_relativeSplatPath));return v.useMemo(()=>Oo(s,JSON.parse(m),f,i==="path"),[s,m,f,i])}function _0(s,a){return E0(s,a)}function E0(s,a,i,c){zr()||He(!1);let{navigator:d}=v.useContext(sn),{matches:f}=v.useContext(ln),m=f[f.length-1],h=m?m.params:{};m&&m.pathname;let x=m?m.pathnameBase:"/";m&&m.route;let y=Ar(),j;if(a){var _;let N=typeof a=="string"?Or(a):a;x==="/"||(_=N.pathname)!=null&&_.startsWith(x)||He(!1),j=N}else j=y;let O=j.pathname||"/",B=O;if(x!=="/"){let N=x.replace(/^\//,"").split("/");B="/"+O.replace(/^\//,"").split("/").slice(N.length).join("/")}let L=e0(s,{pathname:B}),P=O0(L&&L.map(N=>Object.assign({},N,{params:Object.assign({},h,N.params),pathname:Tn([x,d.encodeLocation?d.encodeLocation(N.pathname).pathname:N.pathname]),pathnameBase:N.pathnameBase==="/"?x:Tn([x,d.encodeLocation?d.encodeLocation(N.pathnameBase).pathname:N.pathnameBase])})),f,i,c);return a&&P?v.createElement(ua.Provider,{value:{location:Ts({pathname:"/",search:"",hash:"",state:null,key:"default"},j),navigationType:Rn.Pop}},P):P}function P0(){let s=F0(),a=k0(s)?s.status+" "+s.statusText:s instanceof Error?s.message:JSON.stringify(s),i=s instanceof Error?s.stack:null,d={padding:"0.5rem",backgroundColor:"rgba(200,200,200, 0.5)"};return v.createElement(v.Fragment,null,v.createElement("h2",null,"Unexpected Application Error!"),v.createElement("h3",{style:{fontStyle:"italic"}},a),i?v.createElement("pre",{style:d},i):null,null)}const R0=v.createElement(P0,null);class T0 extends v.Component{constructor(a){super(a),this.state={location:a.location,revalidation:a.revalidation,error:a.error}}static getDerivedStateFromError(a){return{error:a}}static getDerivedStateFromProps(a,i){return i.location!==a.location||i.revalidation!=="idle"&&a.revalidation==="idle"?{error:a.error,location:a.location,revalidation:a.revalidation}:{error:a.error!==void 0?a.error:i.error,location:i.location,revalidation:a.revalidation||i.revalidation}}componentDidCatch(a,i){console.error("React Router caught the following error during render",a,i)}render(){return this.state.error!==void 0?v.createElement(ln.Provider,{value:this.props.routeContext},v.createElement(cf.Provider,{value:this.state.error,children:this.props.component})):this.props.children}}function L0(s){let{routeContext:a,match:i,children:c}=s,d=v.useContext(oa);return d&&d.static&&d.staticContext&&(i.route.errorElement||i.route.ErrorBoundary)&&(d.staticContext._deepestRenderedBoundaryId=i.route.id),v.createElement(ln.Provider,{value:a},c)}function O0(s,a,i,c){var d;if(a===void 0&&(a=[]),i===void 0&&(i=null),c===void 0&&(c=null),s==null){var f;if(!i)return null;if(i.errors)s=i.matches;else if((f=c)!=null&&f.v7_partialHydration&&a.length===0&&!i.initialized&&i.matches.length>0)s=i.matches;else return null}let m=s,h=(d=i)==null?void 0:d.errors;if(h!=null){let j=m.findIndex(_=>_.route.id&&(h==null?void 0:h[_.route.id])!==void 0);j>=0||He(!1),m=m.slice(0,Math.min(m.length,j+1))}let x=!1,y=-1;if(i&&c&&c.v7_partialHydration)for(let j=0;j=0?m=m.slice(0,y+1):m=[m[0]];break}}}return m.reduceRight((j,_,O)=>{let B,L=!1,P=null,N=null;i&&(B=h&&_.route.id?h[_.route.id]:void 0,P=_.route.errorElement||R0,x&&(y<0&&O===0?(M0("route-fallback"),L=!0,N=null):y===O&&(L=!0,N=_.route.hydrateFallbackElement||null)));let A=a.concat(m.slice(0,O+1)),M=()=>{let K;return B?K=P:L?K=N:_.route.Component?K=v.createElement(_.route.Component,null):_.route.element?K=_.route.element:K=j,v.createElement(L0,{match:_,routeContext:{outlet:j,matches:A,isDataRoute:i!=null},children:K})};return i&&(_.route.ErrorBoundary||_.route.errorElement||O===0)?v.createElement(T0,{location:i.location,revalidation:i.revalidation,component:P,error:B,children:M(),routeContext:{outlet:null,matches:A,isDataRoute:!0}}):M()},null)}var ff=(function(s){return s.UseBlocker="useBlocker",s.UseRevalidator="useRevalidator",s.UseNavigateStable="useNavigate",s})(ff||{}),pf=(function(s){return s.UseBlocker="useBlocker",s.UseLoaderData="useLoaderData",s.UseActionData="useActionData",s.UseRouteError="useRouteError",s.UseNavigation="useNavigation",s.UseRouteLoaderData="useRouteLoaderData",s.UseMatches="useMatches",s.UseRevalidator="useRevalidator",s.UseNavigateStable="useNavigate",s.UseRouteId="useRouteId",s})(pf||{});function z0(s){let a=v.useContext(oa);return a||He(!1),a}function A0(s){let a=v.useContext(uf);return a||He(!1),a}function D0(s){let a=v.useContext(ln);return a||He(!1),a}function mf(s){let a=D0(),i=a.matches[a.matches.length-1];return i.route.id||He(!1),i.route.id}function F0(){var s;let a=v.useContext(cf),i=A0(),c=mf();return a!==void 0?a:(s=i.errors)==null?void 0:s[c]}function U0(){let{router:s}=z0(ff.UseNavigateStable),a=mf(pf.UseNavigateStable),i=v.useRef(!1);return df(()=>{i.current=!0}),v.useCallback(function(d,f){f===void 0&&(f={}),i.current&&(typeof d=="number"?s.navigate(d):s.navigate(d,Ts({fromRouteId:a},f)))},[s,a])}const Ld={};function M0(s,a,i){Ld[s]||(Ld[s]=!0)}function I0(s,a){s==null||s.v7_startTransition,s==null||s.v7_relativeSplatPath}function vo(s){let{to:a,replace:i,state:c,relative:d}=s;zr()||He(!1);let{future:f,static:m}=v.useContext(sn),{matches:h}=v.useContext(ln),{pathname:x}=Ar(),y=ca(),j=Oo(a,Lo(h,f.v7_relativeSplatPath),x,d==="path"),_=JSON.stringify(j);return v.useEffect(()=>y(JSON.parse(_),{replace:i,state:c,relative:d}),[y,_,d,i,c]),null}function $0(s){return C0(s.context)}function yt(s){He(!1)}function B0(s){let{basename:a="/",children:i=null,location:c,navigationType:d=Rn.Pop,navigator:f,static:m=!1,future:h}=s;zr()&&He(!1);let x=a.replace(/^\/*/,"/"),y=v.useMemo(()=>({basename:x,navigator:f,static:m,future:Ts({v7_relativeSplatPath:!1},h)}),[x,h,f,m]);typeof c=="string"&&(c=Or(c));let{pathname:j="/",search:_="",hash:O="",state:B=null,key:L="default"}=c,P=v.useMemo(()=>{let N=Rr(j,x);return N==null?null:{location:{pathname:N,search:_,hash:O,state:B,key:L},navigationType:d}},[x,j,_,O,B,L,d]);return P==null?null:v.createElement(sn.Provider,{value:y},v.createElement(ua.Provider,{children:i,value:P}))}function V0(s){let{children:a,location:i}=s;return _0(wo(a),i)}new Promise(()=>{});function wo(s,a){a===void 0&&(a=[]);let i=[];return v.Children.forEach(s,(c,d)=>{if(!v.isValidElement(c))return;let f=[...a,d];if(c.type===v.Fragment){i.push.apply(i,wo(c.props.children,f));return}c.type!==yt&&He(!1),!c.props.index||!c.props.children||He(!1);let m={id:c.props.id||f.join("-"),caseSensitive:c.props.caseSensitive,element:c.props.element,Component:c.props.Component,index:c.props.index,path:c.props.path,loader:c.props.loader,action:c.props.action,errorElement:c.props.errorElement,ErrorBoundary:c.props.ErrorBoundary,hasErrorBoundary:c.props.ErrorBoundary!=null||c.props.errorElement!=null,shouldRevalidate:c.props.shouldRevalidate,handle:c.props.handle,lazy:c.props.lazy};c.props.children&&(m.children=wo(c.props.children,f)),i.push(m)}),i}/** + * React Router DOM v6.30.3 + * + * Copyright (c) Remix Software Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE.md file in the root directory of this source tree. + * + * @license MIT + */function la(){return la=Object.assign?Object.assign.bind():function(s){for(var a=1;a=0)&&(i[d]=s[d]);return i}function H0(s){return!!(s.metaKey||s.altKey||s.ctrlKey||s.shiftKey)}function W0(s,a){return s.button===0&&(!a||a==="_self")&&!H0(s)}const q0=["onClick","relative","reloadDocument","replace","state","target","to","preventScrollReset","viewTransition"],K0=["aria-current","caseSensitive","className","end","style","to","viewTransition","children"],Q0="6";try{window.__reactRouterVersion=Q0}catch{}const J0=v.createContext({isTransitioning:!1}),G0="startTransition",Od=Hm[G0];function Y0(s){let{basename:a,children:i,future:c,window:d}=s,f=v.useRef();f.current==null&&(f.current=Ym({window:d,v5Compat:!0}));let m=f.current,[h,x]=v.useState({action:m.action,location:m.location}),{v7_startTransition:y}=c||{},j=v.useCallback(_=>{y&&Od?Od(()=>x(_)):x(_)},[x,y]);return v.useLayoutEffect(()=>m.listen(j),[m,j]),v.useEffect(()=>I0(c),[c]),v.createElement(B0,{basename:a,children:i,location:h.location,navigationType:h.action,navigator:m,future:c})}const X0=typeof window<"u"&&typeof window.document<"u"&&typeof window.document.createElement<"u",Z0=/^(?:[a-z][a-z0-9+.-]*:|\/\/)/i,eh=v.forwardRef(function(a,i){let{onClick:c,relative:d,reloadDocument:f,replace:m,state:h,target:x,to:y,preventScrollReset:j,viewTransition:_}=a,O=hf(a,q0),{basename:B}=v.useContext(sn),L,P=!1;if(typeof y=="string"&&Z0.test(y)&&(L=y,X0))try{let K=new URL(window.location.href),Q=y.startsWith("//")?new URL(K.protocol+y):new URL(y),me=Rr(Q.pathname,B);Q.origin===K.origin&&me!=null?y=me+Q.search+Q.hash:P=!0}catch{}let N=N0(y,{relative:d}),A=rh(y,{replace:m,state:h,target:x,preventScrollReset:j,relative:d,viewTransition:_});function M(K){c&&c(K),K.defaultPrevented||A(K)}return v.createElement("a",la({},O,{href:L||N,onClick:P||f?c:M,ref:i,target:x}))}),th=v.forwardRef(function(a,i){let{"aria-current":c="page",caseSensitive:d=!1,className:f="",end:m=!1,style:h,to:x,viewTransition:y,children:j}=a,_=hf(a,K0),O=da(x,{relative:_.relative}),B=Ar(),L=v.useContext(uf),{navigator:P,basename:N}=v.useContext(sn),A=L!=null&&sh(O)&&y===!0,M=P.encodeLocation?P.encodeLocation(O).pathname:O.pathname,K=B.pathname,Q=L&&L.navigation&&L.navigation.location?L.navigation.location.pathname:null;d||(K=K.toLowerCase(),Q=Q?Q.toLowerCase():null,M=M.toLowerCase()),Q&&N&&(Q=Rr(Q,N)||Q);const me=M!=="/"&&M.endsWith("/")?M.length-1:M.length;let fe=K===M||!m&&K.startsWith(M)&&K.charAt(me)==="/",z=Q!=null&&(Q===M||!m&&Q.startsWith(M)&&Q.charAt(M.length)==="/"),ae={isActive:fe,isPending:z,isTransitioning:A},de=fe?c:void 0,Y;typeof f=="function"?Y=f(ae):Y=[f,fe?"active":null,z?"pending":null,A?"transitioning":null].filter(Boolean).join(" ");let je=typeof h=="function"?h(ae):h;return v.createElement(eh,la({},_,{"aria-current":de,className:Y,ref:i,style:je,to:x,viewTransition:y}),typeof j=="function"?j(ae):j)});var ko;(function(s){s.UseScrollRestoration="useScrollRestoration",s.UseSubmit="useSubmit",s.UseSubmitFetcher="useSubmitFetcher",s.UseFetcher="useFetcher",s.useViewTransitionState="useViewTransitionState"})(ko||(ko={}));var zd;(function(s){s.UseFetcher="useFetcher",s.UseFetchers="useFetchers",s.UseScrollRestoration="useScrollRestoration"})(zd||(zd={}));function nh(s){let a=v.useContext(oa);return a||He(!1),a}function rh(s,a){let{target:i,replace:c,state:d,preventScrollReset:f,relative:m,viewTransition:h}=a===void 0?{}:a,x=ca(),y=Ar(),j=da(s,{relative:m});return v.useCallback(_=>{if(W0(_,i)){_.preventDefault();let O=c!==void 0?c:sa(y)===sa(j);x(s,{replace:O,state:d,preventScrollReset:f,relative:m,viewTransition:h})}},[y,x,j,c,d,i,s,f,m,h])}function sh(s,a){a===void 0&&(a={});let i=v.useContext(J0);i==null&&He(!1);let{basename:c}=nh(ko.useViewTransitionState),d=da(s,{relative:a.relative});if(!i.isTransitioning)return!1;let f=Rr(i.currentLocation.pathname,c)||i.currentLocation.pathname,m=Rr(i.nextLocation.pathname,c)||i.nextLocation.pathname;return yo(d.pathname,m)!=null||yo(d.pathname,f)!=null}/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const lh=s=>s.replace(/([a-z0-9])([A-Z])/g,"$1-$2").toLowerCase(),xf=(...s)=>s.filter((a,i,c)=>!!a&&a.trim()!==""&&c.indexOf(a)===i).join(" ").trim();/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */var ah={xmlns:"http://www.w3.org/2000/svg",width:24,height:24,viewBox:"0 0 24 24",fill:"none",stroke:"currentColor",strokeWidth:2,strokeLinecap:"round",strokeLinejoin:"round"};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ih=v.forwardRef(({color:s="currentColor",size:a=24,strokeWidth:i=2,absoluteStrokeWidth:c,className:d="",children:f,iconNode:m,...h},x)=>v.createElement("svg",{ref:x,...ah,width:a,height:a,stroke:s,strokeWidth:c?Number(i)*24/Number(a):i,className:xf("lucide",d),...h},[...m.map(([y,j])=>v.createElement(y,j)),...Array.isArray(f)?f:[f]]));/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const _e=(s,a)=>{const i=v.forwardRef(({className:c,...d},f)=>v.createElement(ih,{ref:f,iconNode:a,className:xf(`lucide-${lh(s)}`,c),...d}));return i.displayName=`${s}`,i};/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const oh=_e("Activity",[["path",{d:"M22 12h-2.48a2 2 0 0 0-1.93 1.46l-2.35 8.36a.25.25 0 0 1-.48 0L9.24 2.18a.25.25 0 0 0-.48 0l-2.35 8.36A2 2 0 0 1 4.49 12H2",key:"169zse"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gf=_e("Bell",[["path",{d:"M10.268 21a2 2 0 0 0 3.464 0",key:"vwvbt9"}],["path",{d:"M3.262 15.326A1 1 0 0 0 4 17h16a1 1 0 0 0 .74-1.673C19.41 13.956 18 12.499 18 8A6 6 0 0 0 6 8c0 4.499-1.411 5.956-2.738 7.326",key:"11g9vi"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const oo=_e("Check",[["path",{d:"M20 6 9 17l-5-5",key:"1gmf2c"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const jo=_e("ChevronDown",[["path",{d:"m6 9 6 6 6-6",key:"qrunsl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const No=_e("ChevronRight",[["path",{d:"m9 18 6-6-6-6",key:"mthhwq"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const uh=_e("ChevronUp",[["path",{d:"m18 15-6-6-6 6",key:"153udz"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ad=_e("CircleCheckBig",[["path",{d:"M21.801 10A10 10 0 1 1 17 3.335",key:"yps3ct"}],["path",{d:"m9 11 3 3L22 4",key:"1pflzl"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yf=_e("Clapperboard",[["path",{d:"M20.2 6 3 11l-.9-2.4c-.3-1.1.3-2.2 1.3-2.5l13.5-4c1.1-.3 2.2.3 2.5 1.3Z",key:"1tn4o7"}],["path",{d:"m6.2 5.3 3.1 3.9",key:"iuk76l"}],["path",{d:"m12.4 3.4 3.1 4",key:"6hsd6n"}],["path",{d:"M3 11h18v8a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2Z",key:"ltgou9"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const So=_e("Clock",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["polyline",{points:"12 6 12 12 16 14",key:"68esgv"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Dd=_e("Cpu",[["rect",{width:"16",height:"16",x:"4",y:"4",rx:"2",key:"14l7u7"}],["rect",{width:"6",height:"6",x:"9",y:"9",rx:"1",key:"5aljv4"}],["path",{d:"M15 2v2",key:"13l42r"}],["path",{d:"M15 20v2",key:"15mkzm"}],["path",{d:"M2 15h2",key:"1gxd5l"}],["path",{d:"M2 9h2",key:"1bbxkp"}],["path",{d:"M20 15h2",key:"19e6y8"}],["path",{d:"M20 9h2",key:"19tzq7"}],["path",{d:"M9 2v2",key:"165o2o"}],["path",{d:"M9 20v2",key:"i2bqo8"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ch=_e("Database",[["ellipse",{cx:"12",cy:"5",rx:"9",ry:"3",key:"msslwz"}],["path",{d:"M3 5V19A9 3 0 0 0 21 19V5",key:"1wlel7"}],["path",{d:"M3 12A9 3 0 0 0 21 12",key:"mv7ke4"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Gn=_e("Film",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",key:"afitv7"}],["path",{d:"M7 3v18",key:"bbkbws"}],["path",{d:"M3 7.5h4",key:"zfgn84"}],["path",{d:"M3 12h18",key:"1i2n21"}],["path",{d:"M3 16.5h4",key:"1230mu"}],["path",{d:"M17 3v18",key:"in4fa5"}],["path",{d:"M17 7.5h4",key:"myr1c1"}],["path",{d:"M17 16.5h4",key:"go4c1d"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vf=_e("HeartPulse",[["path",{d:"M19 14c1.49-1.46 3-3.21 3-5.5A5.5 5.5 0 0 0 16.5 3c-1.76 0-3 .5-4.5 2-1.5-1.5-2.74-2-4.5-2A5.5 5.5 0 0 0 2 8.5c0 2.3 1.5 4.05 3 5.5l7 7Z",key:"c3ymky"}],["path",{d:"M3.22 12H9.5l.5-1 2 4.5 2-7 1.5 3.5h5.27",key:"1uw2ng"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const dh=_e("Image",[["rect",{width:"18",height:"18",x:"3",y:"3",rx:"2",ry:"2",key:"1m3agn"}],["circle",{cx:"9",cy:"9",r:"2",key:"af1f0g"}],["path",{d:"m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21",key:"1xmnt7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fh=_e("Info",[["circle",{cx:"12",cy:"12",r:"10",key:"1mglay"}],["path",{d:"M12 16v-4",key:"1dtifu"}],["path",{d:"M12 8h.01",key:"e9boi3"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const ph=_e("LayoutDashboard",[["rect",{width:"7",height:"9",x:"3",y:"3",rx:"1",key:"10lvy0"}],["rect",{width:"7",height:"5",x:"14",y:"3",rx:"1",key:"16une8"}],["rect",{width:"7",height:"9",x:"14",y:"12",rx:"1",key:"1hutg5"}],["rect",{width:"7",height:"5",x:"3",y:"16",rx:"1",key:"ldoo1y"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const wf=_e("List",[["path",{d:"M3 12h.01",key:"nlz23k"}],["path",{d:"M3 18h.01",key:"1tta3j"}],["path",{d:"M3 6h.01",key:"1rqtza"}],["path",{d:"M8 12h13",key:"1za7za"}],["path",{d:"M8 18h13",key:"1lx6n3"}],["path",{d:"M8 6h13",key:"ik3vkj"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Xl=_e("Loader",[["path",{d:"M12 2v4",key:"3427ic"}],["path",{d:"m16.2 7.8 2.9-2.9",key:"r700ao"}],["path",{d:"M18 12h4",key:"wj9ykh"}],["path",{d:"m16.2 16.2 2.9 2.9",key:"1bxg5t"}],["path",{d:"M12 18v4",key:"jadmvz"}],["path",{d:"m4.9 19.1 2.9-2.9",key:"bwix9q"}],["path",{d:"M2 12h4",key:"j09sii"}],["path",{d:"m4.9 4.9 2.9 2.9",key:"giyufr"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const mh=_e("LogOut",[["path",{d:"M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4",key:"1uf3rs"}],["polyline",{points:"16 17 21 12 16 7",key:"1gabdz"}],["line",{x1:"21",x2:"9",y1:"12",y2:"12",key:"1uyos4"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const kf=_e("Pen",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const hh=_e("Pencil",[["path",{d:"M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z",key:"1a8usu"}],["path",{d:"m15 5 4 4",key:"1mk7zo"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const tr=_e("Plus",[["path",{d:"M5 12h14",key:"1ays0h"}],["path",{d:"M12 5v14",key:"s699le"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ge=_e("RefreshCw",[["path",{d:"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8",key:"v9h5vc"}],["path",{d:"M21 3v5h-5",key:"1q7to0"}],["path",{d:"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16",key:"3uifl3"}],["path",{d:"M8 16H3v5",key:"1cv678"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const xh=_e("ScrollText",[["path",{d:"M15 12h-5",key:"r7krc0"}],["path",{d:"M15 8h-5",key:"1khuty"}],["path",{d:"M19 17V5a2 2 0 0 0-2-2H4",key:"zz82l3"}],["path",{d:"M8 21h12a2 2 0 0 0 2-2v-1a1 1 0 0 0-1-1H11a1 1 0 0 0-1 1v1a2 2 0 1 1-4 0V5a2 2 0 1 0-4 0v2a1 1 0 0 0 1 1h3",key:"1ph1d7"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Kt=_e("Search",[["circle",{cx:"11",cy:"11",r:"8",key:"4ej97u"}],["path",{d:"m21 21-4.3-4.3",key:"1qie3q"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const zo=_e("Server",[["rect",{width:"20",height:"8",x:"2",y:"2",rx:"2",ry:"2",key:"ngkwjq"}],["rect",{width:"20",height:"8",x:"2",y:"14",rx:"2",ry:"2",key:"iecqi9"}],["line",{x1:"6",x2:"6.01",y1:"6",y2:"6",key:"16zg32"}],["line",{x1:"6",x2:"6.01",y1:"18",y2:"18",key:"nzw8ys"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const gh=_e("Settings",[["path",{d:"M12.22 2h-.44a2 2 0 0 0-2 2v.18a2 2 0 0 1-1 1.73l-.43.25a2 2 0 0 1-2 0l-.15-.08a2 2 0 0 0-2.73.73l-.22.38a2 2 0 0 0 .73 2.73l.15.1a2 2 0 0 1 1 1.72v.51a2 2 0 0 1-1 1.74l-.15.09a2 2 0 0 0-.73 2.73l.22.38a2 2 0 0 0 2.73.73l.15-.08a2 2 0 0 1 2 0l.43.25a2 2 0 0 1 1 1.73V20a2 2 0 0 0 2 2h.44a2 2 0 0 0 2-2v-.18a2 2 0 0 1 1-1.73l.43-.25a2 2 0 0 1 2 0l.15.08a2 2 0 0 0 2.73-.73l.22-.39a2 2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 .73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 1-1-1.73V4a2 2 0 0 0-2-2z",key:"1qme2f"}],["circle",{cx:"12",cy:"12",r:"3",key:"1v7zrd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const yh=_e("ShieldCheck",[["path",{d:"M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",key:"oel41y"}],["path",{d:"m9 12 2 2 4-4",key:"dzmm74"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Pn=_e("Star",[["path",{d:"M11.525 2.295a.53.53 0 0 1 .95 0l2.31 4.679a2.123 2.123 0 0 0 1.595 1.16l5.166.756a.53.53 0 0 1 .294.904l-3.736 3.638a2.123 2.123 0 0 0-.611 1.878l.882 5.14a.53.53 0 0 1-.771.56l-4.618-2.428a2.122 2.122 0 0 0-1.973 0L6.396 21.01a.53.53 0 0 1-.77-.56l.881-5.139a2.122 2.122 0 0 0-.611-1.879L2.16 9.795a.53.53 0 0 1 .294-.906l5.165-.755a2.122 2.122 0 0 0 1.597-1.16z",key:"r04s7s"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const rn=_e("Trash2",[["path",{d:"M3 6h18",key:"d0wm0j"}],["path",{d:"M19 6v14c0 1-1 2-2 2H7c-1 0-2-1-2-2V6",key:"4alrt4"}],["path",{d:"M8 6V4c0-1 1-2 2-2h4c1 0 2 1 2 2v2",key:"v07s0e"}],["line",{x1:"10",x2:"10",y1:"11",y2:"17",key:"1uufr5"}],["line",{x1:"14",x2:"14",y1:"11",y2:"17",key:"xtxkd"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Zn=_e("TriangleAlert",[["path",{d:"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3",key:"wmoenq"}],["path",{d:"M12 9v4",key:"juzpu7"}],["path",{d:"M12 17h.01",key:"p32p05"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Tr=_e("Tv",[["rect",{width:"20",height:"15",x:"2",y:"7",rx:"2",ry:"2",key:"10ag99"}],["polyline",{points:"17 2 12 7 7 2",key:"11pgbg"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const vh=_e("Upload",[["path",{d:"M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4",key:"ih7n3h"}],["polyline",{points:"17 8 12 3 7 8",key:"t8dd8p"}],["line",{x1:"12",x2:"12",y1:"3",y2:"15",key:"widbto"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const aa=_e("Users",[["path",{d:"M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2",key:"1yyitq"}],["circle",{cx:"9",cy:"7",r:"4",key:"nufk8"}],["path",{d:"M22 21v-2a4 4 0 0 0-3-3.87",key:"kshegd"}],["path",{d:"M16 3.13a4 4 0 0 1 0 7.75",key:"1da9ce"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const fa=_e("Wifi",[["path",{d:"M12 20h.01",key:"zekei9"}],["path",{d:"M2 8.82a15 15 0 0 1 20 0",key:"dnpr2z"}],["path",{d:"M5 12.859a10 10 0 0 1 14 0",key:"1x1e6c"}],["path",{d:"M8.5 16.429a5 5 0 0 1 7 0",key:"1bycff"}]]);/** + * @license lucide-react v0.468.0 - ISC + * + * This source code is licensed under the ISC license. + * See the LICENSE file in the root directory of this source tree. + */const Ln=_e("X",[["path",{d:"M18 6 6 18",key:"1bl5f8"}],["path",{d:"m6 6 12 12",key:"d8bk6v"}]]);function jf(s,a){return function(){return s.apply(a,arguments)}}const{toString:wh}=Object.prototype,{getPrototypeOf:pa}=Object,{iterator:ma,toStringTag:Nf}=Symbol,ha=(s=>a=>{const i=wh.call(a);return s[i]||(s[i]=i.slice(8,-1).toLowerCase())})(Object.create(null)),It=s=>(s=s.toLowerCase(),a=>ha(a)===s),xa=s=>a=>typeof a===s,{isArray:Dr}=Array,Lr=xa("undefined");function Ls(s){return s!==null&&!Lr(s)&&s.constructor!==null&&!Lr(s.constructor)&&vt(s.constructor.isBuffer)&&s.constructor.isBuffer(s)}const Sf=It("ArrayBuffer");function kh(s){let a;return typeof ArrayBuffer<"u"&&ArrayBuffer.isView?a=ArrayBuffer.isView(s):a=s&&s.buffer&&Sf(s.buffer),a}const jh=xa("string"),vt=xa("function"),bf=xa("number"),Os=s=>s!==null&&typeof s=="object",Nh=s=>s===!0||s===!1,ta=s=>{if(ha(s)!=="object")return!1;const a=pa(s);return(a===null||a===Object.prototype||Object.getPrototypeOf(a)===null)&&!(Nf in s)&&!(ma in s)},Sh=s=>{if(!Os(s)||Ls(s))return!1;try{return Object.keys(s).length===0&&Object.getPrototypeOf(s)===Object.prototype}catch{return!1}},bh=It("Date"),Ch=It("File"),_h=s=>!!(s&&typeof s.uri<"u"),Eh=s=>s&&typeof s.getParts<"u",Ph=It("Blob"),Rh=It("FileList"),Th=s=>Os(s)&&vt(s.pipe);function Lh(){return typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:typeof global<"u"?global:{}}const Fd=Lh(),Ud=typeof Fd.FormData<"u"?Fd.FormData:void 0,Oh=s=>{if(!s)return!1;if(Ud&&s instanceof Ud)return!0;const a=pa(s);if(!a||a===Object.prototype||!vt(s.append))return!1;const i=ha(s);return i==="formdata"||i==="object"&&vt(s.toString)&&s.toString()==="[object FormData]"},zh=It("URLSearchParams"),[Ah,Dh,Fh,Uh]=["ReadableStream","Request","Response","Headers"].map(It),Mh=s=>s.trim?s.trim():s.replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,"");function zs(s,a,{allOwnKeys:i=!1}={}){if(s===null||typeof s>"u")return;let c,d;if(typeof s!="object"&&(s=[s]),Dr(s))for(c=0,d=s.length;c0;)if(d=i[c],a===d.toLowerCase())return d;return null}const Yn=typeof globalThis<"u"?globalThis:typeof self<"u"?self:typeof window<"u"?window:global,_f=s=>!Lr(s)&&s!==Yn;function bo(...s){const{caseless:a,skipUndefined:i}=_f(this)&&this||{},c={},d=(f,m)=>{if(m==="__proto__"||m==="constructor"||m==="prototype")return;const h=a&&Cf(c,m)||m,x=Co(c,h)?c[h]:void 0;ta(x)&&ta(f)?c[h]=bo(x,f):ta(f)?c[h]=bo({},f):Dr(f)?c[h]=f.slice():(!i||!Lr(f))&&(c[h]=f)};for(let f=0,m=s.length;f(zs(a,(d,f)=>{i&&vt(d)?Object.defineProperty(s,f,{__proto__:null,value:jf(d,i),writable:!0,enumerable:!0,configurable:!0}):Object.defineProperty(s,f,{__proto__:null,value:d,writable:!0,enumerable:!0,configurable:!0})},{allOwnKeys:c}),s),$h=s=>(s.charCodeAt(0)===65279&&(s=s.slice(1)),s),Bh=(s,a,i,c)=>{s.prototype=Object.create(a.prototype,c),Object.defineProperty(s.prototype,"constructor",{__proto__:null,value:s,writable:!0,enumerable:!1,configurable:!0}),Object.defineProperty(s,"super",{__proto__:null,value:a.prototype}),i&&Object.assign(s.prototype,i)},Vh=(s,a,i,c)=>{let d,f,m;const h={};if(a=a||{},s==null)return a;do{for(d=Object.getOwnPropertyNames(s),f=d.length;f-- >0;)m=d[f],(!c||c(m,s,a))&&!h[m]&&(a[m]=s[m],h[m]=!0);s=i!==!1&&pa(s)}while(s&&(!i||i(s,a))&&s!==Object.prototype);return a},Hh=(s,a,i)=>{s=String(s),(i===void 0||i>s.length)&&(i=s.length),i-=a.length;const c=s.indexOf(a,i);return c!==-1&&c===i},Wh=s=>{if(!s)return null;if(Dr(s))return s;let a=s.length;if(!bf(a))return null;const i=new Array(a);for(;a-- >0;)i[a]=s[a];return i},qh=(s=>a=>s&&a instanceof s)(typeof Uint8Array<"u"&&pa(Uint8Array)),Kh=(s,a)=>{const c=(s&&s[ma]).call(s);let d;for(;(d=c.next())&&!d.done;){const f=d.value;a.call(s,f[0],f[1])}},Qh=(s,a)=>{let i;const c=[];for(;(i=s.exec(a))!==null;)c.push(i);return c},Jh=It("HTMLFormElement"),Gh=s=>s.toLowerCase().replace(/[-_\s]([a-z\d])(\w*)/g,function(i,c,d){return c.toUpperCase()+d}),Co=(({hasOwnProperty:s})=>(a,i)=>s.call(a,i))(Object.prototype),Yh=It("RegExp"),Ef=(s,a)=>{const i=Object.getOwnPropertyDescriptors(s),c={};zs(i,(d,f)=>{let m;(m=a(d,f,s))!==!1&&(c[f]=m||d)}),Object.defineProperties(s,c)},Xh=s=>{Ef(s,(a,i)=>{if(vt(s)&&["arguments","caller","callee"].includes(i))return!1;const c=s[i];if(vt(c)){if(a.enumerable=!1,"writable"in a){a.writable=!1;return}a.set||(a.set=()=>{throw Error("Can not rewrite read-only method '"+i+"'")})}})},Zh=(s,a)=>{const i={},c=d=>{d.forEach(f=>{i[f]=!0})};return Dr(s)?c(s):c(String(s).split(a)),i},ex=()=>{},tx=(s,a)=>s!=null&&Number.isFinite(s=+s)?s:a;function nx(s){return!!(s&&vt(s.append)&&s[Nf]==="FormData"&&s[ma])}const rx=s=>{const a=new WeakSet,i=c=>{if(Os(c)){if(a.has(c))return;if(Ls(c))return c;if(!("toJSON"in c)){a.add(c);const d=Dr(c)?[]:{};return zs(c,(f,m)=>{const h=i(f);!Lr(h)&&(d[m]=h)}),a.delete(c),d}}return c};return i(s)},sx=It("AsyncFunction"),lx=s=>s&&(Os(s)||vt(s))&&vt(s.then)&&vt(s.catch),Pf=((s,a)=>s?setImmediate:a?((i,c)=>(Yn.addEventListener("message",({source:d,data:f})=>{d===Yn&&f===i&&c.length&&c.shift()()},!1),d=>{c.push(d),Yn.postMessage(i,"*")}))(`axios@${Math.random()}`,[]):i=>setTimeout(i))(typeof setImmediate=="function",vt(Yn.postMessage)),ax=typeof queueMicrotask<"u"?queueMicrotask.bind(Yn):typeof process<"u"&&process.nextTick||Pf,ix=s=>s!=null&&vt(s[ma]),C={isArray:Dr,isArrayBuffer:Sf,isBuffer:Ls,isFormData:Oh,isArrayBufferView:kh,isString:jh,isNumber:bf,isBoolean:Nh,isObject:Os,isPlainObject:ta,isEmptyObject:Sh,isReadableStream:Ah,isRequest:Dh,isResponse:Fh,isHeaders:Uh,isUndefined:Lr,isDate:bh,isFile:Ch,isReactNativeBlob:_h,isReactNative:Eh,isBlob:Ph,isRegExp:Yh,isFunction:vt,isStream:Th,isURLSearchParams:zh,isTypedArray:qh,isFileList:Rh,forEach:zs,merge:bo,extend:Ih,trim:Mh,stripBOM:$h,inherits:Bh,toFlatObject:Vh,kindOf:ha,kindOfTest:It,endsWith:Hh,toArray:Wh,forEachEntry:Kh,matchAll:Qh,isHTMLForm:Jh,hasOwnProperty:Co,hasOwnProp:Co,reduceDescriptors:Ef,freezeMethods:Xh,toObjectSet:Zh,toCamelCase:Gh,noop:ex,toFiniteNumber:tx,findKey:Cf,global:Yn,isContextDefined:_f,isSpecCompliantForm:nx,toJSONObject:rx,isAsyncFn:sx,isThenable:lx,setImmediate:Pf,asap:ax,isIterable:ix},ox=C.toObjectSet(["age","authorization","content-length","content-type","etag","expires","from","host","if-modified-since","if-unmodified-since","last-modified","location","max-forwards","proxy-authorization","referer","retry-after","user-agent"]),ux=s=>{const a={};let i,c,d;return s&&s.split(` +`).forEach(function(m){d=m.indexOf(":"),i=m.substring(0,d).trim().toLowerCase(),c=m.substring(d+1).trim(),!(!i||a[i]&&ox[i])&&(i==="set-cookie"?a[i]?a[i].push(c):a[i]=[c]:a[i]=a[i]?a[i]+", "+c:c)}),a};function cx(s){let a=0,i=s.length;for(;aa;){const c=s.charCodeAt(i-1);if(c!==9&&c!==32)break;i-=1}return a===0&&i===s.length?s:s.slice(a,i)}const dx=new RegExp("[\\u0000-\\u0008\\u000a-\\u001f\\u007f]+","g"),fx=new RegExp("[^\\u0009\\u0020-\\u007e\\u0080-\\u00ff]+","g");function Ao(s,a){return C.isArray(s)?s.map(i=>Ao(i,a)):cx(String(s).replace(a,""))}const px=s=>Ao(s,dx),mx=s=>Ao(s,fx);function Rf(s){const a=Object.create(null);return C.forEach(s.toJSON(),(i,c)=>{a[c]=mx(i)}),a}const Md=Symbol("internals");function Ps(s){return s&&String(s).trim().toLowerCase()}function na(s){return s===!1||s==null?s:C.isArray(s)?s.map(na):px(String(s))}function hx(s){const a=Object.create(null),i=/([^\s,;=]+)\s*(?:=\s*([^,;]+))?/g;let c;for(;c=i.exec(s);)a[c[1]]=c[2];return a}const xx=s=>/^[-_a-zA-Z0-9^`|~,!#$%&'*+.]+$/.test(s.trim());function uo(s,a,i,c,d){if(C.isFunction(c))return c.call(this,a,i);if(d&&(a=i),!!C.isString(a)){if(C.isString(c))return a.indexOf(c)!==-1;if(C.isRegExp(c))return c.test(a)}}function gx(s){return s.trim().toLowerCase().replace(/([a-z\d])(\w*)/g,(a,i,c)=>i.toUpperCase()+c)}function yx(s,a){const i=C.toCamelCase(" "+a);["get","set","has"].forEach(c=>{Object.defineProperty(s,c+i,{__proto__:null,value:function(d,f,m){return this[c].call(this,a,d,f,m)},configurable:!0})})}let dt=class{constructor(a){a&&this.set(a)}set(a,i,c){const d=this;function f(h,x,y){const j=Ps(x);if(!j)throw new Error("header name must be a non-empty string");const _=C.findKey(d,j);(!_||d[_]===void 0||y===!0||y===void 0&&d[_]!==!1)&&(d[_||x]=na(h))}const m=(h,x)=>C.forEach(h,(y,j)=>f(y,j,x));if(C.isPlainObject(a)||a instanceof this.constructor)m(a,i);else if(C.isString(a)&&(a=a.trim())&&!xx(a))m(ux(a),i);else if(C.isObject(a)&&C.isIterable(a)){let h={},x,y;for(const j of a){if(!C.isArray(j))throw TypeError("Object iterator must return a key-value pair");h[y=j[0]]=(x=h[y])?C.isArray(x)?[...x,j[1]]:[x,j[1]]:j[1]}m(h,i)}else a!=null&&f(i,a,c);return this}get(a,i){if(a=Ps(a),a){const c=C.findKey(this,a);if(c){const d=this[c];if(!i)return d;if(i===!0)return hx(d);if(C.isFunction(i))return i.call(this,d,c);if(C.isRegExp(i))return i.exec(d);throw new TypeError("parser must be boolean|regexp|function")}}}has(a,i){if(a=Ps(a),a){const c=C.findKey(this,a);return!!(c&&this[c]!==void 0&&(!i||uo(this,this[c],c,i)))}return!1}delete(a,i){const c=this;let d=!1;function f(m){if(m=Ps(m),m){const h=C.findKey(c,m);h&&(!i||uo(c,c[h],h,i))&&(delete c[h],d=!0)}}return C.isArray(a)?a.forEach(f):f(a),d}clear(a){const i=Object.keys(this);let c=i.length,d=!1;for(;c--;){const f=i[c];(!a||uo(this,this[f],f,a,!0))&&(delete this[f],d=!0)}return d}normalize(a){const i=this,c={};return C.forEach(this,(d,f)=>{const m=C.findKey(c,f);if(m){i[m]=na(d),delete i[f];return}const h=a?gx(f):String(f).trim();h!==f&&delete i[f],i[h]=na(d),c[h]=!0}),this}concat(...a){return this.constructor.concat(this,...a)}toJSON(a){const i=Object.create(null);return C.forEach(this,(c,d)=>{c!=null&&c!==!1&&(i[d]=a&&C.isArray(c)?c.join(", "):c)}),i}[Symbol.iterator](){return Object.entries(this.toJSON())[Symbol.iterator]()}toString(){return Object.entries(this.toJSON()).map(([a,i])=>a+": "+i).join(` +`)}getSetCookie(){return this.get("set-cookie")||[]}get[Symbol.toStringTag](){return"AxiosHeaders"}static from(a){return a instanceof this?a:new this(a)}static concat(a,...i){const c=new this(a);return i.forEach(d=>c.set(d)),c}static accessor(a){const c=(this[Md]=this[Md]={accessors:{}}).accessors,d=this.prototype;function f(m){const h=Ps(m);c[h]||(yx(d,m),c[h]=!0)}return C.isArray(a)?a.forEach(f):f(a),this}};dt.accessor(["Content-Type","Content-Length","Accept","Accept-Encoding","User-Agent","Authorization"]);C.reduceDescriptors(dt.prototype,({value:s},a)=>{let i=a[0].toUpperCase()+a.slice(1);return{get:()=>s,set(c){this[i]=c}}});C.freezeMethods(dt);const vx="[REDACTED ****]";function wx(s){if(C.hasOwnProp(s,"toJSON"))return!0;let a=Object.getPrototypeOf(s);for(;a&&a!==Object.prototype;){if(C.hasOwnProp(a,"toJSON"))return!0;a=Object.getPrototypeOf(a)}return!1}function kx(s,a){const i=new Set(a.map(f=>String(f).toLowerCase())),c=[],d=f=>{if(f===null||typeof f!="object"||C.isBuffer(f))return f;if(c.indexOf(f)!==-1)return;f instanceof dt&&(f=f.toJSON()),c.push(f);let m;if(C.isArray(f))m=[],f.forEach((h,x)=>{const y=d(h);C.isUndefined(y)||(m[x]=y)});else{if(!C.isPlainObject(f)&&wx(f))return c.pop(),f;m=Object.create(null);for(const[h,x]of Object.entries(f)){const y=i.has(h.toLowerCase())?vx:d(x);C.isUndefined(y)||(m[h]=y)}}return c.pop(),m};return d(s)}let le=class Tf extends Error{static from(a,i,c,d,f,m){const h=new Tf(a.message,i||a.code,c,d,f);return h.cause=a,h.name=a.name,a.status!=null&&h.status==null&&(h.status=a.status),m&&Object.assign(h,m),h}constructor(a,i,c,d,f){super(a),Object.defineProperty(this,"message",{__proto__:null,value:a,enumerable:!0,writable:!0,configurable:!0}),this.name="AxiosError",this.isAxiosError=!0,i&&(this.code=i),c&&(this.config=c),d&&(this.request=d),f&&(this.response=f,this.status=f.status)}toJSON(){const a=this.config,i=a&&C.hasOwnProp(a,"redact")?a.redact:void 0,c=C.isArray(i)&&i.length>0?kx(a,i):C.toJSONObject(a);return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:c,code:this.code,status:this.status}}};le.ERR_BAD_OPTION_VALUE="ERR_BAD_OPTION_VALUE";le.ERR_BAD_OPTION="ERR_BAD_OPTION";le.ECONNABORTED="ECONNABORTED";le.ETIMEDOUT="ETIMEDOUT";le.ECONNREFUSED="ECONNREFUSED";le.ERR_NETWORK="ERR_NETWORK";le.ERR_FR_TOO_MANY_REDIRECTS="ERR_FR_TOO_MANY_REDIRECTS";le.ERR_DEPRECATED="ERR_DEPRECATED";le.ERR_BAD_RESPONSE="ERR_BAD_RESPONSE";le.ERR_BAD_REQUEST="ERR_BAD_REQUEST";le.ERR_CANCELED="ERR_CANCELED";le.ERR_NOT_SUPPORT="ERR_NOT_SUPPORT";le.ERR_INVALID_URL="ERR_INVALID_URL";le.ERR_FORM_DATA_DEPTH_EXCEEDED="ERR_FORM_DATA_DEPTH_EXCEEDED";const jx=null;function _o(s){return C.isPlainObject(s)||C.isArray(s)}function Lf(s){return C.endsWith(s,"[]")?s.slice(0,-2):s}function co(s,a,i){return s?s.concat(a).map(function(d,f){return d=Lf(d),!i&&f?"["+d+"]":d}).join(i?".":""):a}function Nx(s){return C.isArray(s)&&!s.some(_o)}const Sx=C.toFlatObject(C,{},null,function(a){return/^is[A-Z]/.test(a)});function ga(s,a,i){if(!C.isObject(s))throw new TypeError("target must be an object");a=a||new FormData,i=C.toFlatObject(i,{metaTokens:!0,dots:!1,indexes:!1},!1,function(N,A){return!C.isUndefined(A[N])});const c=i.metaTokens,d=i.visitor||_,f=i.dots,m=i.indexes,h=i.Blob||typeof Blob<"u"&&Blob,x=i.maxDepth===void 0?100:i.maxDepth,y=h&&C.isSpecCompliantForm(a);if(!C.isFunction(d))throw new TypeError("visitor must be a function");function j(P){if(P===null)return"";if(C.isDate(P))return P.toISOString();if(C.isBoolean(P))return P.toString();if(!y&&C.isBlob(P))throw new le("Blob is not supported. Use a Buffer instead.");return C.isArrayBuffer(P)||C.isTypedArray(P)?y&&typeof Blob=="function"?new Blob([P]):Buffer.from(P):P}function _(P,N,A){let M=P;if(C.isReactNative(a)&&C.isReactNativeBlob(P))return a.append(co(A,N,f),j(P)),!1;if(P&&!A&&typeof P=="object"){if(C.endsWith(N,"{}"))N=c?N:N.slice(0,-2),P=JSON.stringify(P);else if(C.isArray(P)&&Nx(P)||(C.isFileList(P)||C.endsWith(N,"[]"))&&(M=C.toArray(P)))return N=Lf(N),M.forEach(function(Q,me){!(C.isUndefined(Q)||Q===null)&&a.append(m===!0?co([N],me,f):m===null?N:N+"[]",j(Q))}),!1}return _o(P)?!0:(a.append(co(A,N,f),j(P)),!1)}const O=[],B=Object.assign(Sx,{defaultVisitor:_,convertValue:j,isVisitable:_o});function L(P,N,A=0){if(!C.isUndefined(P)){if(A>x)throw new le("Object is too deeply nested ("+A+" levels). Max depth: "+x,le.ERR_FORM_DATA_DEPTH_EXCEEDED);if(O.indexOf(P)!==-1)throw Error("Circular reference detected in "+N.join("."));O.push(P),C.forEach(P,function(K,Q){(!(C.isUndefined(K)||K===null)&&d.call(a,K,C.isString(Q)?Q.trim():Q,N,B))===!0&&L(K,N?N.concat(Q):[Q],A+1)}),O.pop()}}if(!C.isObject(s))throw new TypeError("data must be an object");return L(s),a}function Id(s){const a={"!":"%21","'":"%27","(":"%28",")":"%29","~":"%7E","%20":"+"};return encodeURIComponent(s).replace(/[!'()~]|%20/g,function(c){return a[c]})}function Do(s,a){this._pairs=[],s&&ga(s,this,a)}const Of=Do.prototype;Of.append=function(a,i){this._pairs.push([a,i])};Of.toString=function(a){const i=a?function(c){return a.call(this,c,Id)}:Id;return this._pairs.map(function(d){return i(d[0])+"="+i(d[1])},"").join("&")};function bx(s){return encodeURIComponent(s).replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%20/g,"+")}function zf(s,a,i){if(!a)return s;const c=i&&i.encode||bx,d=C.isFunction(i)?{serialize:i}:i,f=d&&d.serialize;let m;if(f?m=f(a,d):m=C.isURLSearchParams(a)?a.toString():new Do(a,d).toString(c),m){const h=s.indexOf("#");h!==-1&&(s=s.slice(0,h)),s+=(s.indexOf("?")===-1?"?":"&")+m}return s}class $d{constructor(){this.handlers=[]}use(a,i,c){return this.handlers.push({fulfilled:a,rejected:i,synchronous:c?c.synchronous:!1,runWhen:c?c.runWhen:null}),this.handlers.length-1}eject(a){this.handlers[a]&&(this.handlers[a]=null)}clear(){this.handlers&&(this.handlers=[])}forEach(a){C.forEach(this.handlers,function(c){c!==null&&a(c)})}}const Fo={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1,legacyInterceptorReqResOrdering:!0},Cx=typeof URLSearchParams<"u"?URLSearchParams:Do,_x=typeof FormData<"u"?FormData:null,Ex=typeof Blob<"u"?Blob:null,Px={isBrowser:!0,classes:{URLSearchParams:Cx,FormData:_x,Blob:Ex},protocols:["http","https","file","blob","url","data"]},Uo=typeof window<"u"&&typeof document<"u",Eo=typeof navigator=="object"&&navigator||void 0,Rx=Uo&&(!Eo||["ReactNative","NativeScript","NS"].indexOf(Eo.product)<0),Tx=typeof WorkerGlobalScope<"u"&&self instanceof WorkerGlobalScope&&typeof self.importScripts=="function",Lx=Uo&&window.location.href||"http://localhost",Ox=Object.freeze(Object.defineProperty({__proto__:null,hasBrowserEnv:Uo,hasStandardBrowserEnv:Rx,hasStandardBrowserWebWorkerEnv:Tx,navigator:Eo,origin:Lx},Symbol.toStringTag,{value:"Module"})),ot={...Ox,...Px};function zx(s,a){return ga(s,new ot.classes.URLSearchParams,{visitor:function(i,c,d,f){return ot.isNode&&C.isBuffer(i)?(this.append(c,i.toString("base64")),!1):f.defaultVisitor.apply(this,arguments)},...a})}function Ax(s){return C.matchAll(/\w+|\[(\w*)]/g,s).map(a=>a[0]==="[]"?"":a[1]||a[0])}function Dx(s){const a={},i=Object.keys(s);let c;const d=i.length;let f;for(c=0;c=i.length;return m=!m&&C.isArray(d)?d.length:m,x?(C.hasOwnProp(d,m)?d[m]=C.isArray(d[m])?d[m].concat(c):[d[m],c]:d[m]=c,!h):((!C.hasOwnProp(d,m)||!C.isObject(d[m]))&&(d[m]=[]),a(i,c,d[m],f)&&C.isArray(d[m])&&(d[m]=Dx(d[m])),!h)}if(C.isFormData(s)&&C.isFunction(s.entries)){const i={};return C.forEachEntry(s,(c,d)=>{a(Ax(c),d,i,0)}),i}return null}const Er=(s,a)=>s!=null&&C.hasOwnProp(s,a)?s[a]:void 0;function Fx(s,a,i){if(C.isString(s))try{return(a||JSON.parse)(s),C.trim(s)}catch(c){if(c.name!=="SyntaxError")throw c}return(i||JSON.stringify)(s)}const As={transitional:Fo,adapter:["xhr","http","fetch"],transformRequest:[function(a,i){const c=i.getContentType()||"",d=c.indexOf("application/json")>-1,f=C.isObject(a);if(f&&C.isHTMLForm(a)&&(a=new FormData(a)),C.isFormData(a))return d?JSON.stringify(Af(a)):a;if(C.isArrayBuffer(a)||C.isBuffer(a)||C.isStream(a)||C.isFile(a)||C.isBlob(a)||C.isReadableStream(a))return a;if(C.isArrayBufferView(a))return a.buffer;if(C.isURLSearchParams(a))return i.setContentType("application/x-www-form-urlencoded;charset=utf-8",!1),a.toString();let h;if(f){const x=Er(this,"formSerializer");if(c.indexOf("application/x-www-form-urlencoded")>-1)return zx(a,x).toString();if((h=C.isFileList(a))||c.indexOf("multipart/form-data")>-1){const y=Er(this,"env"),j=y&&y.FormData;return ga(h?{"files[]":a}:a,j&&new j,x)}}return f||d?(i.setContentType("application/json",!1),Fx(a)):a}],transformResponse:[function(a){const i=Er(this,"transitional")||As.transitional,c=i&&i.forcedJSONParsing,d=Er(this,"responseType"),f=d==="json";if(C.isResponse(a)||C.isReadableStream(a))return a;if(a&&C.isString(a)&&(c&&!d||f)){const h=!(i&&i.silentJSONParsing)&&f;try{return JSON.parse(a,Er(this,"parseReviver"))}catch(x){if(h)throw x.name==="SyntaxError"?le.from(x,le.ERR_BAD_RESPONSE,this,null,Er(this,"response")):x}}return a}],timeout:0,xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ot.classes.FormData,Blob:ot.classes.Blob},validateStatus:function(a){return a>=200&&a<300},headers:{common:{Accept:"application/json, text/plain, */*","Content-Type":void 0}}};C.forEach(["delete","get","head","post","put","patch","query"],s=>{As.headers[s]={}});function fo(s,a){const i=this||As,c=a||i,d=dt.from(c.headers);let f=c.data;return C.forEach(s,function(h){f=h.call(i,f,d.normalize(),a?a.status:void 0)}),d.normalize(),f}function Df(s){return!!(s&&s.__CANCEL__)}let Ds=class extends le{constructor(a,i,c){super(a??"canceled",le.ERR_CANCELED,i,c),this.name="CanceledError",this.__CANCEL__=!0}};function Ff(s,a,i){const c=i.config.validateStatus;!i.status||!c||c(i.status)?s(i):a(new le("Request failed with status code "+i.status,i.status>=400&&i.status<500?le.ERR_BAD_REQUEST:le.ERR_BAD_RESPONSE,i.config,i.request,i))}function Ux(s){const a=/^([-+\w]{1,25}):(?:\/\/)?/.exec(s);return a&&a[1]||""}function Mx(s,a){s=s||10;const i=new Array(s),c=new Array(s);let d=0,f=0,m;return a=a!==void 0?a:1e3,function(x){const y=Date.now(),j=c[f];m||(m=y),i[d]=x,c[d]=y;let _=f,O=0;for(;_!==d;)O+=i[_++],_=_%s;if(d=(d+1)%s,d===f&&(f=(f+1)%s),y-m{i=j,d=null,f&&(clearTimeout(f),f=null),s(...y)};return[(...y)=>{const j=Date.now(),_=j-i;_>=c?m(y,j):(d=y,f||(f=setTimeout(()=>{f=null,m(d)},c-_)))},()=>d&&m(d)]}const ia=(s,a,i=3)=>{let c=0;const d=Mx(50,250);return Ix(f=>{if(!f||typeof f.loaded!="number")return;const m=f.loaded,h=f.lengthComputable?f.total:void 0,x=h!=null?Math.min(m,h):m,y=Math.max(0,x-c),j=d(y);c=Math.max(c,x);const _={loaded:x,total:h,progress:h?x/h:void 0,bytes:y,rate:j||void 0,estimated:j&&h?(h-x)/j:void 0,event:f,lengthComputable:h!=null,[a?"download":"upload"]:!0};s(_)},i)},Bd=(s,a)=>{const i=s!=null;return[c=>a[0]({lengthComputable:i,total:s,loaded:c}),a[1]]},Vd=s=>(...a)=>C.asap(()=>s(...a)),$x=ot.hasStandardBrowserEnv?((s,a)=>i=>(i=new URL(i,ot.origin),s.protocol===i.protocol&&s.host===i.host&&(a||s.port===i.port)))(new URL(ot.origin),ot.navigator&&/(msie|trident)/i.test(ot.navigator.userAgent)):()=>!0,Bx=ot.hasStandardBrowserEnv?{write(s,a,i,c,d,f,m){if(typeof document>"u")return;const h=[`${s}=${encodeURIComponent(a)}`];C.isNumber(i)&&h.push(`expires=${new Date(i).toUTCString()}`),C.isString(c)&&h.push(`path=${c}`),C.isString(d)&&h.push(`domain=${d}`),f===!0&&h.push("secure"),C.isString(m)&&h.push(`SameSite=${m}`),document.cookie=h.join("; ")},read(s){if(typeof document>"u")return null;const a=document.cookie.split(";");for(let i=0;is instanceof dt?{...s}:s;function nr(s,a){a=a||{};const i=Object.create(null);Object.defineProperty(i,"hasOwnProperty",{__proto__:null,value:Object.prototype.hasOwnProperty,enumerable:!1,writable:!0,configurable:!0});function c(y,j,_,O){return C.isPlainObject(y)&&C.isPlainObject(j)?C.merge.call({caseless:O},y,j):C.isPlainObject(j)?C.merge({},j):C.isArray(j)?j.slice():j}function d(y,j,_,O){if(C.isUndefined(j)){if(!C.isUndefined(y))return c(void 0,y,_,O)}else return c(y,j,_,O)}function f(y,j){if(!C.isUndefined(j))return c(void 0,j)}function m(y,j){if(C.isUndefined(j)){if(!C.isUndefined(y))return c(void 0,y)}else return c(void 0,j)}function h(y,j,_){if(C.hasOwnProp(a,_))return c(y,j);if(C.hasOwnProp(s,_))return c(void 0,y)}const x={url:f,method:f,data:f,baseURL:m,transformRequest:m,transformResponse:m,paramsSerializer:m,timeout:m,timeoutMessage:m,withCredentials:m,withXSRFToken:m,adapter:m,responseType:m,xsrfCookieName:m,xsrfHeaderName:m,onUploadProgress:m,onDownloadProgress:m,decompress:m,maxContentLength:m,maxBodyLength:m,beforeRedirect:m,transport:m,httpAgent:m,httpsAgent:m,cancelToken:m,socketPath:m,allowedSocketPaths:m,responseEncoding:m,validateStatus:h,headers:(y,j,_)=>d(Hd(y),Hd(j),_,!0)};return C.forEach(Object.keys({...s,...a}),function(j){if(j==="__proto__"||j==="constructor"||j==="prototype")return;const _=C.hasOwnProp(x,j)?x[j]:d,O=C.hasOwnProp(s,j)?s[j]:void 0,B=C.hasOwnProp(a,j)?a[j]:void 0,L=_(O,B,j);C.isUndefined(L)&&_!==h||(i[j]=L)}),i}const Wx=["content-type","content-length"];function qx(s,a,i){if(i!=="content-only"){s.set(a);return}Object.entries(a).forEach(([c,d])=>{Wx.includes(c.toLowerCase())&&s.set(c,d)})}const Kx=s=>encodeURIComponent(s).replace(/%([0-9A-F]{2})/gi,(a,i)=>String.fromCharCode(parseInt(i,16))),Mf=s=>{const a=nr({},s),i=O=>C.hasOwnProp(a,O)?a[O]:void 0,c=i("data");let d=i("withXSRFToken");const f=i("xsrfHeaderName"),m=i("xsrfCookieName");let h=i("headers");const x=i("auth"),y=i("baseURL"),j=i("allowAbsoluteUrls"),_=i("url");if(a.headers=h=dt.from(h),a.url=zf(Uf(y,_,j),s.params,s.paramsSerializer),x&&h.set("Authorization","Basic "+btoa((x.username||"")+":"+(x.password?Kx(x.password):""))),C.isFormData(c)&&(ot.hasStandardBrowserEnv||ot.hasStandardBrowserWebWorkerEnv?h.setContentType(void 0):C.isFunction(c.getHeaders)&&qx(h,c.getHeaders(),i("formDataHeaderPolicy"))),ot.hasStandardBrowserEnv&&(C.isFunction(d)&&(d=d(a)),d===!0||d==null&&$x(a.url))){const B=f&&m&&Bx.read(m);B&&h.set(f,B)}return a},Qx=typeof XMLHttpRequest<"u",Jx=Qx&&function(s){return new Promise(function(i,c){const d=Mf(s);let f=d.data;const m=dt.from(d.headers).normalize();let{responseType:h,onUploadProgress:x,onDownloadProgress:y}=d,j,_,O,B,L;function P(){B&&B(),L&&L(),d.cancelToken&&d.cancelToken.unsubscribe(j),d.signal&&d.signal.removeEventListener("abort",j)}let N=new XMLHttpRequest;N.open(d.method.toUpperCase(),d.url,!0),N.timeout=d.timeout;function A(){if(!N)return;const K=dt.from("getAllResponseHeaders"in N&&N.getAllResponseHeaders()),me={data:!h||h==="text"||h==="json"?N.responseText:N.response,status:N.status,statusText:N.statusText,headers:K,config:s,request:N};Ff(function(z){i(z),P()},function(z){c(z),P()},me),N=null}"onloadend"in N?N.onloadend=A:N.onreadystatechange=function(){!N||N.readyState!==4||N.status===0&&!(N.responseURL&&N.responseURL.startsWith("file:"))||setTimeout(A)},N.onabort=function(){N&&(c(new le("Request aborted",le.ECONNABORTED,s,N)),P(),N=null)},N.onerror=function(Q){const me=Q&&Q.message?Q.message:"Network Error",fe=new le(me,le.ERR_NETWORK,s,N);fe.event=Q||null,c(fe),P(),N=null},N.ontimeout=function(){let Q=d.timeout?"timeout of "+d.timeout+"ms exceeded":"timeout exceeded";const me=d.transitional||Fo;d.timeoutErrorMessage&&(Q=d.timeoutErrorMessage),c(new le(Q,me.clarifyTimeoutError?le.ETIMEDOUT:le.ECONNABORTED,s,N)),P(),N=null},f===void 0&&m.setContentType(null),"setRequestHeader"in N&&C.forEach(Rf(m),function(Q,me){N.setRequestHeader(me,Q)}),C.isUndefined(d.withCredentials)||(N.withCredentials=!!d.withCredentials),h&&h!=="json"&&(N.responseType=d.responseType),y&&([O,L]=ia(y,!0),N.addEventListener("progress",O)),x&&N.upload&&([_,B]=ia(x),N.upload.addEventListener("progress",_),N.upload.addEventListener("loadend",B)),(d.cancelToken||d.signal)&&(j=K=>{N&&(c(!K||K.type?new Ds(null,s,N):K),N.abort(),P(),N=null)},d.cancelToken&&d.cancelToken.subscribe(j),d.signal&&(d.signal.aborted?j():d.signal.addEventListener("abort",j)));const M=Ux(d.url);if(M&&!ot.protocols.includes(M)){c(new le("Unsupported protocol "+M+":",le.ERR_BAD_REQUEST,s));return}N.send(f||null)})},Gx=(s,a)=>{if(s=s?s.filter(Boolean):[],!a&&!s.length)return;const i=new AbortController;let c=!1;const d=function(x){if(!c){c=!0,m();const y=x instanceof Error?x:this.reason;i.abort(y instanceof le?y:new Ds(y instanceof Error?y.message:y))}};let f=a&&setTimeout(()=>{f=null,d(new le(`timeout of ${a}ms exceeded`,le.ETIMEDOUT))},a);const m=()=>{s&&(f&&clearTimeout(f),f=null,s.forEach(x=>{x.unsubscribe?x.unsubscribe(d):x.removeEventListener("abort",d)}),s=null)};s.forEach(x=>x.addEventListener("abort",d));const{signal:h}=i;return h.unsubscribe=()=>C.asap(m),h},Yx=function*(s,a){let i=s.byteLength;if(i{const d=Xx(s,a);let f=0,m,h=x=>{m||(m=!0,c&&c(x))};return new ReadableStream({async pull(x){try{const{done:y,value:j}=await d.next();if(y){h(),x.close();return}let _=j.byteLength;if(i){let O=f+=_;i(O)}x.enqueue(new Uint8Array(j))}catch(y){throw h(y),y}},cancel(x){return h(x),d.return()}},{highWaterMark:2})};function eg(s){if(!s||typeof s!="string"||!s.startsWith("data:"))return 0;const a=s.indexOf(",");if(a<0)return 0;const i=s.slice(5,a),c=s.slice(a+1);if(/;base64/i.test(i)){let m=c.length;const h=c.length;for(let B=0;B=48&&L<=57||L>=65&&L<=70||L>=97&&L<=102)&&(P>=48&&P<=57||P>=65&&P<=70||P>=97&&P<=102)&&(m-=2,B+=2)}let x=0,y=h-1;const j=B=>B>=2&&c.charCodeAt(B-2)===37&&c.charCodeAt(B-1)===51&&(c.charCodeAt(B)===68||c.charCodeAt(B)===100);y>=0&&(c.charCodeAt(y)===61?(x++,y--):j(y)&&(x++,y-=3)),x===1&&y>=0&&(c.charCodeAt(y)===61||j(y))&&x++;const O=Math.floor(m/4)*3-(x||0);return O>0?O:0}if(typeof Buffer<"u"&&typeof Buffer.byteLength=="function")return Buffer.byteLength(c,"utf8");let f=0;for(let m=0,h=c.length;m=55296&&x<=56319&&m+1=56320&&y<=57343?(f+=4,m++):f+=3}else f+=3}return f}const Mo="1.16.1",qd=64*1024,{isFunction:Zl}=C,Kd=(s,...a)=>{try{return!!s(...a)}catch{return!1}},tg=s=>{const a=C.global!==void 0&&C.global!==null?C.global:globalThis,{ReadableStream:i,TextEncoder:c}=a;s=C.merge.call({skipUndefined:!0},{Request:a.Request,Response:a.Response},s);const{fetch:d,Request:f,Response:m}=s,h=d?Zl(d):typeof fetch=="function",x=Zl(f),y=Zl(m);if(!h)return!1;const j=h&&Zl(i),_=h&&(typeof c=="function"?(A=>M=>A.encode(M))(new c):async A=>new Uint8Array(await new f(A).arrayBuffer())),O=x&&j&&Kd(()=>{let A=!1;const M=new f(ot.origin,{body:new i,method:"POST",get duplex(){return A=!0,"half"}}),K=M.headers.has("Content-Type");return M.body!=null&&M.body.cancel(),A&&!K}),B=y&&j&&Kd(()=>C.isReadableStream(new m("").body)),L={stream:B&&(A=>A.body)};h&&["text","arrayBuffer","blob","formData","stream"].forEach(A=>{!L[A]&&(L[A]=(M,K)=>{let Q=M&&M[A];if(Q)return Q.call(M);throw new le(`Response type '${A}' is not supported`,le.ERR_NOT_SUPPORT,K)})});const P=async A=>{if(A==null)return 0;if(C.isBlob(A))return A.size;if(C.isSpecCompliantForm(A))return(await new f(ot.origin,{method:"POST",body:A}).arrayBuffer()).byteLength;if(C.isArrayBufferView(A)||C.isArrayBuffer(A))return A.byteLength;if(C.isURLSearchParams(A)&&(A=A+""),C.isString(A))return(await _(A)).byteLength},N=async(A,M)=>{const K=C.toFiniteNumber(A.getContentLength());return K??P(M)};return async A=>{let{url:M,method:K,data:Q,signal:me,cancelToken:fe,timeout:z,onDownloadProgress:ae,onUploadProgress:de,responseType:Y,headers:je,withCredentials:Te="same-origin",fetchOptions:ze,maxContentLength:Ee,maxBodyLength:q}=Mf(A);const ge=C.isNumber(Ee)&&Ee>-1,D=C.isNumber(q)&&q>-1;let U=d||fetch;Y=Y?(Y+"").toLowerCase():"text";let ee=Gx([me,fe&&fe.toAbortSignal()],z),G=null;const b=ee&&ee.unsubscribe&&(()=>{ee.unsubscribe()});let I;try{if(ge&&typeof M=="string"&&M.startsWith("data:")&&eg(M)>Ee)throw new le("maxContentLength size of "+Ee+" exceeded",le.ERR_BAD_RESPONSE,A,G);if(D&&K!=="get"&&K!=="head"){const oe=await N(je,Q);if(typeof oe=="number"&&isFinite(oe)&&oe>q)throw new le("Request body larger than maxBodyLength limit",le.ERR_BAD_REQUEST,A,G)}if(de&&O&&K!=="get"&&K!=="head"&&(I=await N(je,Q))!==0){let oe=new f(M,{method:"POST",body:Q,duplex:"half"}),F;if(C.isFormData(Q)&&(F=oe.headers.get("content-type"))&&je.setContentType(F),oe.body){const[ne,ke]=Bd(I,ia(Vd(de)));Q=Wd(oe.body,qd,ne,ke)}}C.isString(Te)||(Te=Te?"include":"omit");const te=x&&"credentials"in f.prototype;if(C.isFormData(Q)){const oe=je.getContentType();oe&&/^multipart\/form-data/i.test(oe)&&!/boundary=/i.test(oe)&&je.delete("content-type")}je.set("User-Agent","axios/"+Mo,!1);const pe={...ze,signal:ee,method:K.toUpperCase(),headers:Rf(je.normalize()),body:Q,duplex:"half",credentials:te?Te:void 0};G=x&&new f(M,pe);let ye=await(x?U(G,ze):U(M,pe));if(ge){const oe=C.toFiniteNumber(ye.headers.get("content-length"));if(oe!=null&&oe>Ee)throw new le("maxContentLength size of "+Ee+" exceeded",le.ERR_BAD_RESPONSE,A,G)}const Ne=B&&(Y==="stream"||Y==="response");if(B&&ye.body&&(ae||ge||Ne&&b)){const oe={};["status","statusText","headers"].forEach(Le=>{oe[Le]=ye[Le]});const F=C.toFiniteNumber(ye.headers.get("content-length")),[ne,ke]=ae&&Bd(F,ia(Vd(ae),!0))||[];let Ce=0;const De=Le=>{if(ge&&(Ce=Le,Ce>Ee))throw new le("maxContentLength size of "+Ee+" exceeded",le.ERR_BAD_RESPONSE,A,G);ne&&ne(Le)};ye=new m(Wd(ye.body,qd,De,()=>{ke&&ke(),b&&b()}),oe)}Y=Y||"text";let we=await L[C.findKey(L,Y)||"text"](ye,A);if(ge&&!B&&!Ne){let oe;if(we!=null&&(typeof we.byteLength=="number"?oe=we.byteLength:typeof we.size=="number"?oe=we.size:typeof we=="string"&&(oe=typeof c=="function"?new c().encode(we).byteLength:we.length)),typeof oe=="number"&&oe>Ee)throw new le("maxContentLength size of "+Ee+" exceeded",le.ERR_BAD_RESPONSE,A,G)}return!Ne&&b&&b(),await new Promise((oe,F)=>{Ff(oe,F,{data:we,headers:dt.from(ye.headers),status:ye.status,statusText:ye.statusText,config:A,request:G})})}catch(te){if(b&&b(),ee&&ee.aborted&&ee.reason instanceof le){const pe=ee.reason;throw pe.config=A,G&&(pe.request=G),te!==pe&&(pe.cause=te),pe}throw te&&te.name==="TypeError"&&/Load failed|fetch/i.test(te.message)?Object.assign(new le("Network Error",le.ERR_NETWORK,A,G,te&&te.response),{cause:te.cause||te}):le.from(te,te&&te.code,A,G,te&&te.response)}}},ng=new Map,If=s=>{let a=s&&s.env||{};const{fetch:i,Request:c,Response:d}=a,f=[c,d,i];let m=f.length,h=m,x,y,j=ng;for(;h--;)x=f[h],y=j.get(x),y===void 0&&j.set(x,y=h?new Map:tg(a)),j=y;return y};If();const Io={http:jx,xhr:Jx,fetch:{get:If}};C.forEach(Io,(s,a)=>{if(s){try{Object.defineProperty(s,"name",{__proto__:null,value:a})}catch{}Object.defineProperty(s,"adapterName",{__proto__:null,value:a})}});const Qd=s=>`- ${s}`,rg=s=>C.isFunction(s)||s===null||s===!1;function sg(s,a){s=C.isArray(s)?s:[s];const{length:i}=s;let c,d;const f={};for(let m=0;m`adapter ${x} `+(y===!1?"is not supported by the environment":"is not available in the build"));let h=i?m.length>1?`since : +`+m.map(Qd).join(` +`):" "+Qd(m[0]):"as no adapter specified";throw new le("There is no suitable adapter to dispatch the request "+h,"ERR_NOT_SUPPORT")}return d}const $f={getAdapter:sg,adapters:Io};function po(s){if(s.cancelToken&&s.cancelToken.throwIfRequested(),s.signal&&s.signal.aborted)throw new Ds(null,s)}function Jd(s){return po(s),s.headers=dt.from(s.headers),s.data=fo.call(s,s.transformRequest),["post","put","patch"].indexOf(s.method)!==-1&&s.headers.setContentType("application/x-www-form-urlencoded",!1),$f.getAdapter(s.adapter||As.adapter,s)(s).then(function(c){po(s),s.response=c;try{c.data=fo.call(s,s.transformResponse,c)}finally{delete s.response}return c.headers=dt.from(c.headers),c},function(c){if(!Df(c)&&(po(s),c&&c.response)){s.response=c.response;try{c.response.data=fo.call(s,s.transformResponse,c.response)}finally{delete s.response}c.response.headers=dt.from(c.response.headers)}return Promise.reject(c)})}const ya={};["object","boolean","number","function","string","symbol"].forEach((s,a)=>{ya[s]=function(c){return typeof c===s||"a"+(a<1?"n ":" ")+s}});const Gd={};ya.transitional=function(a,i,c){function d(f,m){return"[Axios v"+Mo+"] Transitional option '"+f+"'"+m+(c?". "+c:"")}return(f,m,h)=>{if(a===!1)throw new le(d(m," has been removed"+(i?" in "+i:"")),le.ERR_DEPRECATED);return i&&!Gd[m]&&(Gd[m]=!0,console.warn(d(m," has been deprecated since v"+i+" and will be removed in the near future"))),a?a(f,m,h):!0}};ya.spelling=function(a){return(i,c)=>(console.warn(`${c} is likely a misspelling of ${a}`),!0)};function lg(s,a,i){if(typeof s!="object")throw new le("options must be an object",le.ERR_BAD_OPTION_VALUE);const c=Object.keys(s);let d=c.length;for(;d-- >0;){const f=c[d],m=Object.prototype.hasOwnProperty.call(a,f)?a[f]:void 0;if(m){const h=s[f],x=h===void 0||m(h,f,s);if(x!==!0)throw new le("option "+f+" must be "+x,le.ERR_BAD_OPTION_VALUE);continue}if(i!==!0)throw new le("Unknown option "+f,le.ERR_BAD_OPTION)}}const ra={assertOptions:lg,validators:ya},Tt=ra.validators;let er=class{constructor(a){this.defaults=a||{},this.interceptors={request:new $d,response:new $d}}async request(a,i){try{return await this._request(a,i)}catch(c){if(c instanceof Error){let d={};Error.captureStackTrace?Error.captureStackTrace(d):d=new Error;const f=(()=>{if(!d.stack)return"";const m=d.stack.indexOf(` +`);return m===-1?"":d.stack.slice(m+1)})();try{if(!c.stack)c.stack=f;else if(f){const m=f.indexOf(` +`),h=m===-1?-1:f.indexOf(` +`,m+1),x=h===-1?"":f.slice(h+1);String(c.stack).endsWith(x)||(c.stack+=` +`+f)}}catch{}}throw c}}_request(a,i){typeof a=="string"?(i=i||{},i.url=a):i=a||{},i=nr(this.defaults,i);const{transitional:c,paramsSerializer:d,headers:f}=i;c!==void 0&&ra.assertOptions(c,{silentJSONParsing:Tt.transitional(Tt.boolean),forcedJSONParsing:Tt.transitional(Tt.boolean),clarifyTimeoutError:Tt.transitional(Tt.boolean),legacyInterceptorReqResOrdering:Tt.transitional(Tt.boolean)},!1),d!=null&&(C.isFunction(d)?i.paramsSerializer={serialize:d}:ra.assertOptions(d,{encode:Tt.function,serialize:Tt.function},!0)),i.allowAbsoluteUrls!==void 0||(this.defaults.allowAbsoluteUrls!==void 0?i.allowAbsoluteUrls=this.defaults.allowAbsoluteUrls:i.allowAbsoluteUrls=!0),ra.assertOptions(i,{baseUrl:Tt.spelling("baseURL"),withXsrfToken:Tt.spelling("withXSRFToken")},!0),i.method=(i.method||this.defaults.method||"get").toLowerCase();let m=f&&C.merge(f.common,f[i.method]);f&&C.forEach(["delete","get","head","post","put","patch","query","common"],L=>{delete f[L]}),i.headers=dt.concat(m,f);const h=[];let x=!0;this.interceptors.request.forEach(function(P){if(typeof P.runWhen=="function"&&P.runWhen(i)===!1)return;x=x&&P.synchronous;const N=i.transitional||Fo;N&&N.legacyInterceptorReqResOrdering?h.unshift(P.fulfilled,P.rejected):h.push(P.fulfilled,P.rejected)});const y=[];this.interceptors.response.forEach(function(P){y.push(P.fulfilled,P.rejected)});let j,_=0,O;if(!x){const L=[Jd.bind(this),void 0];for(L.unshift(...h),L.push(...y),O=L.length,j=Promise.resolve(i);_{if(!c._listeners)return;let f=c._listeners.length;for(;f-- >0;)c._listeners[f](d);c._listeners=null}),this.promise.then=d=>{let f;const m=new Promise(h=>{c.subscribe(h),f=h}).then(d);return m.cancel=function(){c.unsubscribe(f)},m},a(function(f,m,h){c.reason||(c.reason=new Ds(f,m,h),i(c.reason))})}throwIfRequested(){if(this.reason)throw this.reason}subscribe(a){if(this.reason){a(this.reason);return}this._listeners?this._listeners.push(a):this._listeners=[a]}unsubscribe(a){if(!this._listeners)return;const i=this._listeners.indexOf(a);i!==-1&&this._listeners.splice(i,1)}toAbortSignal(){const a=new AbortController,i=c=>{a.abort(c)};return this.subscribe(i),a.signal.unsubscribe=()=>this.unsubscribe(i),a.signal}static source(){let a;return{token:new Bf(function(d){a=d}),cancel:a}}};function ig(s){return function(i){return s.apply(null,i)}}function og(s){return C.isObject(s)&&s.isAxiosError===!0}const Po={Continue:100,SwitchingProtocols:101,Processing:102,EarlyHints:103,Ok:200,Created:201,Accepted:202,NonAuthoritativeInformation:203,NoContent:204,ResetContent:205,PartialContent:206,MultiStatus:207,AlreadyReported:208,ImUsed:226,MultipleChoices:300,MovedPermanently:301,Found:302,SeeOther:303,NotModified:304,UseProxy:305,Unused:306,TemporaryRedirect:307,PermanentRedirect:308,BadRequest:400,Unauthorized:401,PaymentRequired:402,Forbidden:403,NotFound:404,MethodNotAllowed:405,NotAcceptable:406,ProxyAuthenticationRequired:407,RequestTimeout:408,Conflict:409,Gone:410,LengthRequired:411,PreconditionFailed:412,PayloadTooLarge:413,UriTooLong:414,UnsupportedMediaType:415,RangeNotSatisfiable:416,ExpectationFailed:417,ImATeapot:418,MisdirectedRequest:421,UnprocessableEntity:422,Locked:423,FailedDependency:424,TooEarly:425,UpgradeRequired:426,PreconditionRequired:428,TooManyRequests:429,RequestHeaderFieldsTooLarge:431,UnavailableForLegalReasons:451,InternalServerError:500,NotImplemented:501,BadGateway:502,ServiceUnavailable:503,GatewayTimeout:504,HttpVersionNotSupported:505,VariantAlsoNegotiates:506,InsufficientStorage:507,LoopDetected:508,NotExtended:510,NetworkAuthenticationRequired:511,WebServerIsDown:521,ConnectionTimedOut:522,OriginIsUnreachable:523,TimeoutOccurred:524,SslHandshakeFailed:525,InvalidSslCertificate:526};Object.entries(Po).forEach(([s,a])=>{Po[a]=s});function Vf(s){const a=new er(s),i=jf(er.prototype.request,a);return C.extend(i,er.prototype,a,{allOwnKeys:!0}),C.extend(i,a,null,{allOwnKeys:!0}),i.create=function(d){return Vf(nr(s,d))},i}const qe=Vf(As);qe.Axios=er;qe.CanceledError=Ds;qe.CancelToken=ag;qe.isCancel=Df;qe.VERSION=Mo;qe.toFormData=ga;qe.AxiosError=le;qe.Cancel=qe.CanceledError;qe.all=function(a){return Promise.all(a)};qe.spread=ig;qe.isAxiosError=og;qe.mergeConfig=nr;qe.AxiosHeaders=dt;qe.formToJSON=s=>Af(C.isHTMLForm(s)?new FormData(s):s);qe.getAdapter=$f.getAdapter;qe.HttpStatusCode=Po;qe.default=qe;const{Axios:Qg,AxiosError:Jg,CanceledError:Gg,isCancel:Yg,CancelToken:Xg,VERSION:Zg,all:ey,Cancel:ty,isAxiosError:ny,spread:ry,toFormData:sy,AxiosHeaders:ly,HttpStatusCode:ay,formToJSON:iy,getAdapter:oy,mergeConfig:uy,create:cy}=qe,X=qe.create({baseURL:"/api/admin"});X.interceptors.request.use(s=>{const a=localStorage.getItem("token");return a&&(s.headers.Authorization=`Bearer ${a}`),s});X.interceptors.response.use(s=>s,s=>{var a;return((a=s.response)==null?void 0:a.status)===401&&(localStorage.removeItem("token"),window.location.href="/login"),Promise.reject(s)});async function ug(s,a){const i=new FormData;i.append("username",s),i.append("password",a);const{data:c}=await qe.post("/api/admin/auth/token",i);return c.access_token}function cg(){const[s,a]=v.useState(""),[i,c]=v.useState(""),[d,f]=v.useState(""),[m,h]=v.useState(!1),x=ca();async function y(j){j.preventDefault(),h(!0),f("");try{const _=await ug(s,i);localStorage.setItem("token",_),x("/dashboard")}catch{f("Credenciales incorrectas")}finally{h(!1)}}return l.jsx("div",{className:"min-h-screen bg-dark-900 flex items-center justify-center p-4",children:l.jsxs("div",{className:"w-full max-w-sm",children:[l.jsxs("div",{className:"flex items-center justify-center gap-3 mb-8",children:[l.jsx(fa,{className:"text-primary-500",size:32}),l.jsx("h1",{className:"text-3xl font-bold",children:"KiraStream"})]}),l.jsxs("form",{onSubmit:y,className:"bg-dark-800 rounded-xl p-6 space-y-4 border border-dark-700",children:[l.jsx("h2",{className:"text-center text-gray-400 text-sm",children:"Panel de Administración"}),d&&l.jsx("div",{className:"bg-red-900/30 border border-red-700 text-red-400 text-sm rounded p-2 text-center",children:d}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Usuario"}),l.jsx("input",{value:s,onChange:j=>a(j.target.value),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-primary-500",autoComplete:"username",required:!0})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Contraseña"}),l.jsx("input",{type:"password",value:i,onChange:j=>c(j.target.value),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-primary-500",autoComplete:"current-password",required:!0})]}),l.jsx("button",{type:"submit",disabled:m,className:"w-full bg-primary-500 hover:bg-primary-600 disabled:opacity-50 rounded-lg py-2 text-sm font-medium transition-colors",children:m?"Entrando...":"Entrar"})]})]})})}function Hf(s){var a,i,c="";if(typeof s=="string"||typeof s=="number")c+=s;else if(typeof s=="object")if(Array.isArray(s)){var d=s.length;for(a=0;a{const L=async()=>{try{const{data:N}=await X.get("/providers/notifications/all");m(N.total||0),a&&d(N.notifications||[])}catch{}};L();const P=setInterval(L,12e4);return()=>clearInterval(P)},[a]),v.useEffect(()=>{a&&_()},[a]),v.useEffect(()=>{const L=P=>{y.current&&!y.current.contains(P.target)&&i(!1)};return a&&document.addEventListener("mousedown",L),()=>document.removeEventListener("mousedown",L)},[a]);async function O(L,P,N){await X.post("/providers/notifications/dismiss",{provider_id:L,category_id:P,category_type:N}),d(A=>A.map(M=>M.provider_id===L?{...M,categories:M.categories.filter(K=>!(K.id===P&&K.type===N))}:M).filter(M=>M.categories.length>0)),m(A=>Math.max(0,A-1))}async function B(L){var N;await X.post(`/providers/notifications/dismiss-provider/${L}`),d(A=>A.filter(M=>M.provider_id!==L));const P=((N=c.find(A=>A.provider_id===L))==null?void 0:N.categories.length)??0;m(A=>Math.max(0,A-P))}return l.jsxs("div",{className:"flex h-screen overflow-hidden",children:[l.jsxs("aside",{className:"w-56 bg-dark-800 border-r border-dark-700 flex flex-col shrink-0",children:[l.jsxs("div",{className:"flex items-center gap-2 p-4 border-b border-dark-700",children:[l.jsx(fa,{className:"text-primary-500",size:22}),l.jsx("span",{className:"font-bold text-lg tracking-tight flex-1",children:"KiraStream"}),l.jsxs("div",{className:"relative",ref:y,children:[l.jsxs("button",{onClick:()=>i(L=>!L),className:Mt("relative p-1 rounded-lg transition-colors",a?"bg-dark-600 text-yellow-400":"text-gray-500 hover:text-yellow-400 hover:bg-dark-700"),title:"Notificaciones",children:[l.jsx(gf,{size:16}),f>0&&l.jsx("span",{className:"absolute -top-1 -right-1 bg-yellow-500 text-black text-[9px] font-bold rounded-full w-4 h-4 flex items-center justify-center",children:f>99?"99+":f})]}),a&&l.jsxs("div",{className:"absolute left-0 top-full mt-2 w-80 bg-dark-800 border border-dark-700 rounded-xl shadow-2xl z-50 flex flex-col max-h-[70vh]",children:[l.jsxs("div",{className:"p-3 border-b border-dark-700 flex items-center justify-between shrink-0",children:[l.jsx("span",{className:"font-semibold text-sm",children:"Nuevas categorías"}),l.jsx("button",{onClick:()=>i(!1),className:"text-gray-500 hover:text-white",children:l.jsx(Ln,{size:14})})]}),h?l.jsx("div",{className:"flex items-center justify-center p-8",children:l.jsx(Ge,{size:18,className:"animate-spin text-gray-400"})}):c.length===0?l.jsx("div",{className:"p-6 text-center text-gray-500 text-sm",children:"Sin novedades pendientes ✓"}):l.jsx("div",{className:"overflow-y-auto flex-1 p-2 space-y-3",children:c.map(L=>l.jsxs("div",{className:"bg-dark-900/50 rounded-lg border border-dark-700 overflow-hidden",children:[l.jsxs("div",{className:"flex items-center justify-between px-3 py-2 bg-dark-700/40",children:[l.jsx("span",{className:"text-xs font-semibold text-gray-300 truncate",children:L.provider_name}),l.jsxs("div",{className:"flex items-center gap-1 shrink-0",children:[l.jsx("span",{className:"text-xs text-gray-500",children:L.categories.length}),l.jsx("button",{onClick:()=>B(L.provider_id),className:"text-xs text-gray-500 hover:text-red-400 ml-1 px-1.5 py-0.5 rounded hover:bg-dark-600",title:"Descartar todas",children:"Ignorar todas"})]})]}),l.jsx("div",{className:"p-2 space-y-1 max-h-48 overflow-y-auto",children:L.categories.map(P=>l.jsxs("div",{className:"flex items-center gap-2 px-2 py-1 rounded hover:bg-dark-700 group",children:[l.jsx("span",{className:"text-xs flex-1 truncate",children:P.name}),l.jsx("span",{className:`text-[10px] px-1 py-0.5 rounded border shrink-0 ${pg[P.type]}`,children:fg[P.type]}),l.jsx("button",{onClick:()=>O(L.provider_id,P.id,P.type),className:"opacity-0 group-hover:opacity-100 text-gray-600 hover:text-red-400 transition-opacity shrink-0",title:"Descartar",children:l.jsx(Ln,{size:12})})]},`${P.id}_${P.type}`))}),l.jsx("div",{className:"px-3 py-2 border-t border-dark-700",children:l.jsxs("button",{onClick:()=>{i(!1),s("/providers")},className:"text-xs text-primary-400 hover:text-primary-300 flex items-center gap-1",children:["Ir a Proveedores para sincronizar ",l.jsx(No,{size:11})]})})]},L.provider_id))})]})]})]}),l.jsx("nav",{className:"flex-1 p-3 space-y-1",children:dg.map(({to:L,icon:P,label:N})=>l.jsxs(th,{to:L,className:({isActive:A})=>Mt("flex items-center gap-3 px-3 py-2 rounded-lg text-sm font-medium transition-colors",A?"bg-primary-500/20 text-primary-400":"text-gray-400 hover:bg-dark-700 hover:text-gray-100"),children:[l.jsx(P,{size:17}),N]},L))}),l.jsxs("button",{onClick:j,className:"flex items-center gap-3 p-4 text-sm text-gray-500 hover:text-red-400 border-t border-dark-700 transition-colors",children:[l.jsx(mh,{size:16})," Cerrar sesión"]})]}),l.jsx("main",{className:"flex-1 overflow-auto bg-dark-900",children:l.jsx($0,{})})]})}function hg(s){return s<1024?s+" B":s<1048576?(s/1024).toFixed(1)+" KB":s<1073741824?(s/1048576).toFixed(1)+" MB":(s/1073741824).toFixed(2)+" GB"}function mo(s){return s<=0?"—":s<1024?s.toFixed(0)+" B/s":s<1048576?(s/1024).toFixed(0)+" KB/s":(s/1048576).toFixed(1)+" MB/s"}function xg(s){const a=Math.floor(Date.now()/1e3-s),i=Math.floor(a/3600),c=Math.floor(a%3600/60),d=a%60;return i>0?`${i}h ${c}m`:c>0?`${c}m ${d}s`:`${d}s`}function gg(s){if(!s.width||!s.height)return null;const a=s.width>=3840?"4K":s.width>=1920?"FHD":s.width>=1280?"HD":s.width>=720?"SD":"LD";return`${s.width}×${s.height} (${a})`}function yg({info:s}){if(!s||Object.keys(s).length===0)return l.jsx("span",{className:"text-gray-600 text-xs italic",children:"Detectando..."});const a=gg(s),i=s.fps?`${s.fps} fps`:null,c=s.video_codec?s.video_codec.toUpperCase():null,d=s.audio_codec?s.audio_codec.toUpperCase():null,f=s.bitrate_bps?`${(s.bitrate_bps/1e6).toFixed(1)} Mb/s`:null;return l.jsxs("div",{className:"space-y-0.5",children:[a&&l.jsxs("div",{className:"text-gray-200 font-mono text-xs",children:[a,i?` · ${i}`:""]}),l.jsxs("div",{className:"flex gap-1 flex-wrap",children:[c&&l.jsx("span",{className:"bg-blue-900/40 text-blue-300 text-[10px] px-1.5 py-0.5 rounded border border-blue-800",children:c}),d&&l.jsxs("span",{className:"bg-purple-900/40 text-purple-300 text-[10px] px-1.5 py-0.5 rounded border border-purple-800",children:[d,s.audio_channels?` ${s.audio_channels}ch`:""]}),f&&l.jsx("span",{className:"text-gray-500 text-[10px]",children:f})]})]})}function vg({status:s,reconnectCount:a}){return!s||s==="ok"?a&&a>0?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded bg-yellow-900/40 text-yellow-300 border border-yellow-800",title:`${a} reconexión(es)`,children:[l.jsx(Ge,{size:9})," ",a]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] text-green-500",children:[l.jsx("span",{className:"w-1.5 h-1.5 rounded-full bg-green-500 animate-pulse inline-block"})," OK"]}):s==="connecting"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] text-gray-400",children:[l.jsx(Ge,{size:9,className:"animate-spin"})," Conectando"]}):s==="reconnecting"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] text-orange-400",children:[l.jsx(Ge,{size:9,className:"animate-spin"})," Reconectando ",a?`(×${a})`:""]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] text-red-400",children:[l.jsx(Zn,{size:9})," ",s]})}function wg({health:s,desyncs:a,corrections:i}){const c=i!=null&&i>0,d=a!=null&&a>0,f=s==="error"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded bg-red-900/40 text-red-300 border border-red-800",children:[l.jsx(Zn,{size:9})," A/V error"]}):s==="warning"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded bg-yellow-900/40 text-yellow-300 border border-yellow-800",children:[l.jsx(vf,{size:9})," A/V aviso"]}):l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] text-emerald-500",children:[l.jsx(yh,{size:9})," A/V ok"]});return l.jsxs("div",{className:"flex flex-wrap items-center gap-1 mt-1",children:[f,c&&l.jsxs("span",{className:"inline-flex items-center gap-1 text-[10px] px-1.5 py-0.5 rounded bg-violet-900/40 text-violet-300 border border-violet-800",title:"Correcciones automáticas del monitor de salud",children:[l.jsx(Ge,{size:9})," ×",i]}),d&&l.jsxs("span",{className:"text-[10px] text-gray-600 tabular-nums",title:"Eventos A/V en stderr de ffmpeg (informativos)",children:[a," ev."]})]})}function kg({pct:s,serverSecs:a,serverCapacity:i}){const c=s??0,d=c>=70?"bg-red-500":c>=40?"bg-yellow-400":"bg-emerald-500",f=c>=70?"text-red-400":c>=40?"text-yellow-400":"text-emerald-500",m=a??0,h=((i??0)/1048576).toFixed(0),x=m>.5?`${m.toFixed(1)}s`:"ok",y=m>10?"text-yellow-400":"text-emerald-500",j=`Buffer servidor: ${m>0?m.toFixed(1)+"s de cobertura":"0 — normal en reposo"}. Capacidad máx: ${h} MB. El buffer se activa durante reconexiones del proveedor.`;return l.jsxs("div",{className:"mt-1.5 space-y-0.5",children:[l.jsxs("div",{className:"flex items-center justify-between",title:`Cola cliente: ${c.toFixed(0)}% — 0%=consume sin retraso, 100%=cliente lento`,children:[l.jsx("span",{className:"text-[10px] text-gray-500",children:"Cola cliente"}),l.jsxs("span",{className:`text-[10px] font-mono tabular-nums ${f}`,children:[c.toFixed(0),"%"]})]}),l.jsx("div",{className:"w-full h-1.5 rounded-full bg-dark-700 overflow-hidden",children:l.jsx("div",{className:`h-full rounded-full transition-all duration-700 ${d}`,style:{width:`${Math.min(c,100)}%`}})}),l.jsxs("div",{className:"flex items-center justify-between pt-0.5",title:j,children:[l.jsxs("span",{className:"text-[10px] text-gray-500",children:["Reserva (",h," MB)"]}),l.jsx("span",{className:`text-[10px] font-mono tabular-nums ${y}`,children:x})]})]})}const jg={live:l.jsx(Tr,{size:12,className:"text-blue-400"}),movie:l.jsx(Gn,{size:12,className:"text-purple-400"}),series:l.jsx(yf,{size:12,className:"text-green-400"})},Ng={live:"Directo",movie:"Película",series:"Serie"},Sg={live:"bg-blue-900/30 border-blue-800 text-blue-300",movie:"bg-purple-900/30 border-purple-800 text-purple-300",series:"bg-green-900/30 border-green-800 text-green-300"};function bg(){const[s,a]=v.useState([]),[i,c]=v.useState([]),[d,f]=v.useState(!1),[m,h]=v.useState(null),[x,y]=v.useState(null),j=v.useRef(null);v.useEffect(()=>{const ae=`${window.location.protocol==="https:"?"wss":"ws"}://${window.location.host}/api/admin/monitoring/ws`,de=new WebSocket(ae);return j.current=de,de.onopen=()=>f(!0),de.onclose=()=>f(!1),de.onmessage=Y=>{const je=JSON.parse(Y.data);(je.type==="state"||je.type==="update")&&a(je.data)},()=>de.close()},[]),v.useEffect(()=>{X.get("/monitoring/slots").then(z=>c(z.data)).catch(()=>{})},[s]);async function _(z,ae){var de,Y;if(confirm(`¿Cortar la conexión de "${ae}"?`)){h(z),y(null);try{await X.post("/monitoring/kill",{client_id:z})}catch(je){const Te=(Y=(de=je==null?void 0:je.response)==null?void 0:de.data)==null?void 0:Y.detail;y(Te||"Error al cortar la conexión"),setTimeout(()=>y(null),4e3)}finally{h(null)}}}const O=s.reduce((z,ae)=>z+ae.client_count,0),B=i.filter(z=>z.status==="busy").length,L=s.reduce((z,ae)=>z+(ae.bps_down||0),0),P=s.reduce((z,ae)=>z+(ae.ffmpeg_cpu_pct??0),0),N=s.some(z=>z.status==="reconnecting"),A=s.filter(z=>!z.av_health||z.av_health==="ok").length,M=s.filter(z=>z.av_health==="warning").length,K=s.filter(z=>z.av_health==="error").length,Q=s.reduce((z,ae)=>z+(ae.corrections??0),0),me=K>0?"text-red-400":M>0?"text-yellow-400":"text-emerald-400",fe=s.length===0?"—":K>0?`${K} error${K>1?"es":""}`:M>0?`${M} aviso${M>1?"s":""}`:`${A} ok`;return l.jsxs("div",{className:"p-6 space-y-6",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Dashboard"}),l.jsxs("div",{className:"flex items-center gap-3",children:[N&&l.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-orange-400 bg-orange-900/30 border border-orange-800 px-2 py-1 rounded-lg",children:[l.jsx(Ge,{size:11,className:"animate-spin"}),"Reconectando stream(s)..."]}),K>0&&l.jsxs("span",{className:"flex items-center gap-1.5 text-xs text-red-400 bg-red-900/30 border border-red-800 px-2 py-1 rounded-lg",children:[l.jsx(Zn,{size:11}),K," stream",K>1?"s":""," con error A/V"]}),l.jsxs("div",{className:`flex items-center gap-2 text-xs ${d?"text-green-400":"text-red-400"}`,children:[l.jsx("span",{className:`w-2 h-2 rounded-full ${d?"bg-green-400 animate-pulse":"bg-red-400"}`}),d?"Conectado en tiempo real":"Desconectado"]})]})]}),x&&l.jsx("div",{className:"bg-red-900/40 border border-red-700 rounded-lg px-4 py-2 text-sm text-red-300",children:x}),l.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-6 gap-4",children:[l.jsx(Pr,{icon:l.jsx(oh,{size:20,className:"text-blue-400"}),label:"Streams activos",value:s.length}),l.jsx(Pr,{icon:l.jsx(aa,{size:20,className:"text-green-400"}),label:"Usuarios conectados",value:O}),l.jsx(Pr,{icon:l.jsx(zo,{size:20,className:"text-orange-400"}),label:"Slots ocupados",value:`${B}/${i.length}`}),l.jsx(Pr,{icon:l.jsx(fa,{size:20,className:"text-purple-400"}),label:"↓ Total proveedor",value:mo(L)}),l.jsx(Pr,{icon:l.jsx(Dd,{size:20,className:P>80?"text-red-400":P>40?"text-yellow-400":"text-cyan-400"}),label:"ffmpeg CPU total",value:`${P.toFixed(2)}%`}),l.jsx(Pr,{icon:l.jsx(vf,{size:20,className:me}),label:`Salud A/V${Q>0?` · ${Q} corr.`:""}`,value:fe,valueClass:me})]}),i.length>0&&l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 p-4",children:[l.jsx("h2",{className:"text-sm font-semibold text-gray-400 mb-3",children:"Estado de Slots del Proveedor"}),l.jsx("div",{className:"flex flex-wrap gap-2",children:i.map(z=>l.jsxs("div",{className:`px-3 py-1.5 rounded-lg text-xs font-medium border ${z.status==="busy"?"bg-orange-900/30 border-orange-700 text-orange-300":"bg-green-900/30 border-green-800 text-green-400"}`,children:[l.jsx("span",{className:"font-bold",children:z.name}),l.jsx("span",{className:"ml-2 opacity-70",children:z.status==="busy"?`ch#${z.channel_id}`:"libre"})]},z.id))})]}),l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700",children:[l.jsx("div",{className:"p-4 border-b border-dark-700",children:l.jsx("h2",{className:"text-sm font-semibold text-gray-300",children:"Streams en Reproducción"})}),s.length===0?l.jsx("div",{className:"p-8 text-center text-gray-500 text-sm",children:"No hay streams activos"}):l.jsx("div",{className:"overflow-x-auto",children:l.jsxs("table",{className:"w-full text-sm",children:[l.jsx("thead",{children:l.jsxs("tr",{className:"text-left text-xs text-gray-500 border-b border-dark-700",children:[l.jsx("th",{className:"px-4 py-2",children:"Tipo"}),l.jsx("th",{className:"px-4 py-2",children:"Canal"}),l.jsx("th",{className:"px-4 py-2",children:"Proveedor"}),l.jsx("th",{className:"px-4 py-2",children:"Stream"}),l.jsx("th",{className:"px-4 py-2",children:"Estado"}),l.jsx("th",{className:"px-4 py-2",children:"Salud A/V"}),l.jsx("th",{className:"px-4 py-2",children:"Usuarios"}),l.jsx("th",{className:"px-4 py-2",children:"↓ / ↑"}),l.jsx("th",{className:"px-4 py-2",children:"Tiempo"}),l.jsx("th",{className:"px-4 py-2",children:"Datos"})]})}),l.jsx("tbody",{children:s.map((z,ae)=>l.jsxs("tr",{className:"border-b border-dark-700 hover:bg-dark-700/30 align-top",children:[l.jsx("td",{className:"px-4 py-2.5",children:l.jsxs("span",{className:`inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded border ${Sg[z.stream_type]}`,children:[jg[z.stream_type],Ng[z.stream_type]]})}),l.jsxs("td",{className:"px-4 py-2.5",children:[l.jsx("span",{className:"font-medium text-gray-200 text-xs leading-tight block max-w-[160px] truncate",title:z.channel_name,children:z.channel_name}),l.jsxs("span",{className:"text-gray-600 text-xs",children:["#",z.channel_id]})]}),l.jsx("td",{className:"px-4 py-2.5",children:l.jsx("span",{className:"bg-orange-900/40 text-orange-300 text-xs px-2 py-0.5 rounded",children:z.provider_name||`#${z.provider_account_id}`})}),l.jsx("td",{className:"px-4 py-2.5 min-w-[160px]",children:z.stream_info?l.jsx(yg,{info:z.stream_info}):l.jsx("span",{className:"text-gray-600 text-xs italic",children:"—"})}),l.jsxs("td",{className:"px-4 py-2.5",children:[l.jsx(vg,{status:z.status,reconnectCount:z.reconnect_count}),z.ffmpeg_pid&&l.jsxs("div",{className:"mt-1.5 flex items-center gap-1.5",children:[l.jsxs("span",{className:"inline-flex items-center gap-1 bg-cyan-900/40 text-cyan-300 text-[10px] px-1.5 py-0.5 rounded border border-cyan-800 font-mono",children:[l.jsx(Dd,{size:9}),"ffmpeg"]}),z.ffmpeg_cpu_pct!==void 0&&l.jsxs("span",{className:`font-mono text-[10px] tabular-nums ${z.ffmpeg_cpu_pct>80?"text-red-400":z.ffmpeg_cpu_pct>40?"text-yellow-400":"text-gray-400"}`,children:[z.ffmpeg_cpu_pct.toFixed(2),"%"]})]})]}),l.jsxs("td",{className:"px-4 py-2.5 min-w-[140px]",children:[l.jsx(wg,{health:z.av_health,desyncs:z.av_desync_count,corrections:z.corrections}),l.jsx(kg,{pct:z.buffer_pct,serverSecs:z.buffer_server_secs,serverCapacity:z.buffer_capacity})]}),l.jsx("td",{className:"px-4 py-2.5",children:l.jsx("div",{className:"flex flex-col gap-1",children:z.clients.map(de=>l.jsxs("div",{className:"flex items-center gap-1.5",children:[l.jsx("span",{className:"text-gray-300 text-xs font-medium",children:de.username}),l.jsx("button",{onClick:()=>_(de.client_id,de.username),disabled:m===de.client_id,title:`Cortar conexión de ${de.username}`,className:"p-0.5 rounded hover:bg-red-900/40 text-gray-600 hover:text-red-400 transition-colors disabled:opacity-40 shrink-0",children:l.jsx(Ln,{size:11})})]},de.client_id))})}),l.jsxs("td",{className:"px-4 py-2.5 font-mono text-xs",children:[l.jsxs("div",{className:"text-cyan-400",children:["↓ ",mo(z.bps_down)]}),l.jsxs("div",{className:"text-green-400",children:["↑ ",mo(z.bps_up)]})]}),l.jsxs("td",{className:"px-4 py-2.5 text-gray-400 font-mono text-xs",children:[l.jsx(So,{size:11,className:"inline mr-1"}),xg(z.started_at)]}),l.jsx("td",{className:"px-4 py-2.5 text-gray-500 text-xs font-mono",children:hg(z.bytes_pumped)})]},ae))})]})})]})]})}function Pr({icon:s,label:a,value:i,valueClass:c}){return l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl p-4 flex items-center gap-4",children:[l.jsx("div",{className:"bg-dark-700 p-2.5 rounded-lg",children:s}),l.jsxs("div",{children:[l.jsx("p",{className:"text-xs text-gray-500",children:a}),l.jsx("p",{className:`text-2xl font-bold ${c??""}`,children:i})]})]})}function Cg(s){if(!s)return null;const a=new Date(s),i=Math.ceil((a.getTime()-Date.now())/864e5);return i<0?{label:"Expirado",cls:"text-red-400 bg-red-900/20 border border-red-800"}:i<=7?{label:`Caduca en ${i}d`,cls:"text-red-400 bg-red-900/20 border border-red-800"}:i<=30?{label:`Caduca en ${i}d`,cls:"text-yellow-400 bg-yellow-900/20 border border-yellow-800"}:{label:`Caduca: ${a.toLocaleDateString("es-ES")}`,cls:"text-green-400 bg-green-900/20 border border-green-800"}}const _g=[{key:"live",label:"Canales en directo"},{key:"movie",label:"Películas (VOD)"},{key:"series",label:"Series"}],Yd=[{value:0,label:"Desactivado"},{value:6,label:"Cada 6 horas"},{value:12,label:"Cada 12 horas"},{value:24,label:"Cada 24 horas"}],Xd={name:"",base_url:"",username:"",password:"",max_connections:1,auto_sync_hours:0};function Eg(){const[s,a]=v.useState([]),[i,c]=v.useState(Xd),[d,f]=v.useState(!1),[m,h]=v.useState(new Set),[x,y]=v.useState({}),[j,_]=v.useState({}),[O,B]=v.useState(null),[L,P]=v.useState({}),N=v.useRef({}),[A,M]=v.useState(null),[K,Q]=v.useState(!1),[me,fe]=v.useState({live:[],movie:[],series:[]}),[z,ae]=v.useState({live:new Set,movie:new Set,series:new Set}),[de,Y]=v.useState(""),[je,Te]=v.useState({}),[ze,Ee]=v.useState(null),[q,ge]=v.useState({name:"",base_url:"",username:"",password:"",max_connections:1,auto_sync_hours:0}),[D,U]=v.useState(null),[ee,G]=v.useState(!1),[b,I]=v.useState([]),[te,pe]=v.useState(new Set),[ye,Ne]=v.useState(""),[we,oe]=v.useState({}),[F,ne]=v.useState(new Set),[ke,Ce]=v.useState(null),[De,Le]=v.useState({url:"",priority:10,is_active:!0}),[Fr,Ur]=v.useState(new Set);async function wt(){const{data:w}=await X.get("/providers/");return a(w),w}v.useEffect(()=>(wt().then(async w=>{for(const $ of w)try{const{data:ue}=await X.get(`/providers/${$.id}/sync/status`);ue.status==="running"&&(h(Se=>new Set(Se).add($.id)),y(Se=>({...Se,[$.id]:ue.progress||"Sincronizando..."})),rr($.id))}catch{}}),()=>{Object.keys(N.current).forEach(w=>{N.current[+w]=!1})}),[]);function rr(w){N.current[w]=!0;const $=async()=>{if(N.current[w])try{const{data:ue}=await X.get(`/providers/${w}/sync/status`);y(Se=>({...Se,[w]:ue.progress||""})),_(Se=>({...Se,[w]:ue.stats||{}})),ue.status==="running"?setTimeout($,1500):(N.current[w]=!1,h(Se=>{const Ae=new Set(Se);return Ae.delete(w),Ae}),y(Se=>({...Se,[w]:ue.status==="done"?"✓ Sync completado":`Error: ${ue.progress}`})),wt())}catch{N.current[w]=!1,h(ue=>{const Se=new Set(ue);return Se.delete(w),Se})}};$()}async function Mr(w){w.preventDefault(),await X.post("/providers/",i),c(Xd),f(!1),wt()}async function On(w){confirm("¿Eliminar este proveedor y todos sus canales?")&&(await X.delete(`/providers/${w}`),wt())}async function an(w){B(w);try{const{data:$}=await X.post(`/providers/${w}/test`);P(ue=>({...ue,[w]:$.connected})),$.connected&&wt()}finally{B(null)}}function Ir(w){Ee(w),ge({name:w.name,base_url:w.base_url,username:w.username,password:"",max_connections:w.max_connections,auto_sync_hours:w.auto_sync_hours})}async function Fs(){var w,$;if(ze)try{await X.put(`/providers/${ze.id}`,q),Ee(null),wt()}catch(ue){alert("Error al guardar: "+((($=(w=ue.response)==null?void 0:w.data)==null?void 0:$.detail)||ue.message))}}async function Us(w){var $,ue,Se;M(w),Q(!0),Y(""),Te({});try{const[Ae,$e]=await Promise.all([X.get(`/providers/${w.id}/sync/categories`),X.get(`/providers/${w.id}/synced-category-ids`)]);fe(Ae.data);let lr=$e.data.live,qr=$e.data.movie,un=$e.data.series;if(w.last_sync_categories)try{const $t=JSON.parse(w.last_sync_categories);((($=$t.live)==null?void 0:$.length)??0)+(((ue=$t.movie)==null?void 0:ue.length)??0)+(((Se=$t.series)==null?void 0:Se.length)??0)>0&&(lr=$t.live??[],qr=$t.movie??[],un=$t.series??[])}catch{}ae({live:new Set(lr),movie:new Set(qr),series:new Set(un)})}catch{M(null)}finally{Q(!1)}}async function Ms(){if(!A)return;const w=A.id;M(null),h($=>new Set($).add(w)),y($=>({...$,[w]:"Iniciando..."}));try{await X.post(`/providers/${w}/sync`,{live_category_ids:Array.from(z.live),movie_category_ids:Array.from(z.movie),series_category_ids:Array.from(z.series)}),rr(w)}catch{h($=>{const ue=new Set($);return ue.delete(w),ue}),y($=>({...$,[w]:"Error al iniciar sync"}))}}function Is(w,$){ae(ue=>{const Se=new Set(ue[w]);return Se.has($)?Se.delete($):Se.add($),{...ue,[w]:Se}})}function $r(w,$){ae(ue=>({...ue,[w]:new Set($.map(Se=>Se.id))}))}function sr(w){ae($=>({...$,[w]:new Set}))}async function $s(w){U(w),G(!0),Ne(""),pe(new Set);try{const{data:$}=await X.get(`/providers/${w.id}/available-updates`);I($.new_categories||[])}catch{I([])}finally{G(!1)}}async function zn(w){try{const{data:$}=await X.get(`/providers/${w}/available-updates`);oe(ue=>({...ue,[w]:$.total||0}))}catch{}}v.useEffect(()=>{s.forEach(w=>{w.last_sync_at&&zn(w.id)})},[s.length]);async function An(){if(!D||te.size===0)return;const w=D.id,$=[],ue=[],Se=[];b.filter(Ae=>te.has(Ae.id+"_"+Ae.type)).forEach(Ae=>{Ae.type==="live"?$.push(Ae.id):Ae.type==="movie"?ue.push(Ae.id):Ae.type==="series"&&Se.push(Ae.id)}),U(null),h(Ae=>new Set(Ae).add(w)),y(Ae=>({...Ae,[w]:"Iniciando..."}));try{await X.post(`/providers/${w}/sync`,{live_category_ids:$.length>0?$:void 0,movie_category_ids:ue.length>0?ue:void 0,series_category_ids:Se.length>0?Se:void 0}),rr(w)}catch{h(Ae=>{const $e=new Set(Ae);return $e.delete(w),$e}),y(Ae=>({...Ae,[w]:"Error al iniciar sync"}))}}function va(w){ne($=>{const ue=new Set($);return ue.has(w)?ue.delete(w):ue.add(w),ue})}async function Bs(w){await X.post(`/providers/${w}/urls`,De),Ce(null),Le({url:"",priority:10,is_active:!0}),wt()}async function Vs(w,$){confirm("¿Eliminar esta URL de failover?")&&(await X.delete(`/providers/${w}/urls/${$}`),wt())}async function wa(w){Ur($=>new Set($).add(w));try{await X.post(`/providers/${w}/urls/check-all`),wt()}finally{Ur($=>{const ue=new Set($);return ue.delete(w),ue})}}function Br(w){return w.status==="ok"?l.jsxs("span",{className:"text-green-400 text-xs font-mono",children:["● ",w.response_ms!=null?`${w.response_ms}ms`:"OK"]}):w.status==="error"?l.jsx("span",{className:"text-red-400 text-xs font-mono",children:"● Error"}):w.status==="timeout"?l.jsx("span",{className:"text-yellow-400 text-xs font-mono",children:"● Timeout"}):l.jsx("span",{className:"text-gray-500 text-xs font-mono",children:"○ Desconocido"})}const on=Object.values(z).reduce((w,$)=>w+$.size,0),Vr=Object.values(me).reduce((w,$)=>w+$.length,0),Hr={live:"Directo",movie:"Película",series:"Serie"},Wr={live:"bg-blue-900/30 text-blue-300 border-blue-800",movie:"bg-purple-900/30 text-purple-300 border-purple-800",series:"bg-green-900/30 text-green-300 border-green-800"},Qt=b.filter(w=>!ye||w.name.toLowerCase().includes(ye.toLowerCase()));return l.jsxs("div",{className:"p-6 space-y-5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Proveedores IPTV"}),l.jsxs("button",{onClick:()=>f(w=>!w),className:"flex items-center gap-2 bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium transition-colors",children:[l.jsx(tr,{size:16})," Añadir proveedor"]})]}),d&&l.jsxs("form",{onSubmit:Mr,className:"bg-dark-800 border border-dark-700 rounded-xl p-5 space-y-3",children:[l.jsx("h3",{className:"font-semibold text-sm mb-2",children:"Nueva cuenta de proveedor"}),l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsx(Jn,{label:"Nombre",value:i.name,onChange:w=>c($=>({...$,name:w})),required:!0}),l.jsx(Jn,{label:"URL base (ej: http://provider.com:8080)",value:i.base_url,onChange:w=>c($=>({...$,base_url:w})),required:!0}),l.jsx(Jn,{label:"Usuario",value:i.username,onChange:w=>c($=>({...$,username:w})),required:!0}),l.jsx(Jn,{label:"Contraseña",value:i.password,onChange:w=>c($=>({...$,password:w})),required:!0}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Conexiones máx."}),l.jsx("input",{type:"number",min:1,max:100,value:i.max_connections,onChange:w=>c($=>({...$,max_connections:+w.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Auto-sincronización"}),l.jsx("select",{value:i.auto_sync_hours,onChange:w=>c($=>({...$,auto_sync_hours:+w.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",children:Yd.map(w=>l.jsx("option",{value:w.value,children:w.label},w.value))})]})]}),l.jsxs("div",{className:"flex gap-2 pt-1",children:[l.jsx("button",{type:"submit",className:"bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:"Guardar"}),l.jsx("button",{type:"button",onClick:()=>f(!1),className:"bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm",children:"Cancelar"})]})]}),A&&l.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 w-full max-w-2xl flex flex-col max-h-[90vh]",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between shrink-0",children:[l.jsxs("div",{children:[l.jsxs("h2",{className:"font-semibold",children:["Seleccionar categorías — ",l.jsx("span",{className:"text-primary-400",children:A.name})]}),!K&&l.jsxs("p",{className:"text-xs text-gray-500 mt-0.5",children:[on," de ",Vr," categorías seleccionadas"]})]}),l.jsx("button",{onClick:()=>M(null),className:"text-gray-500 hover:text-white",children:"✕"})]}),K?l.jsx("div",{className:"flex-1 flex items-center justify-center p-12",children:l.jsxs("div",{className:"text-center text-gray-400",children:[l.jsx(Ge,{size:24,className:"animate-spin mx-auto mb-3"}),l.jsx("p",{className:"text-sm",children:"Obteniendo categorías del proveedor..."})]})}):l.jsxs(l.Fragment,{children:[l.jsx("div",{className:"p-3 border-b border-dark-700 shrink-0",children:l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:de,onChange:w=>Y(w.target.value),placeholder:"Buscar categoría...",className:"w-full bg-dark-700 border border-dark-600 rounded-lg pl-9 pr-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]})}),l.jsx("div",{className:"overflow-y-auto flex-1 p-3 space-y-2",children:_g.map(({key:w,label:$})=>{const ue=me[w].filter($e=>!de||$e.name.toLowerCase().includes(de.toLowerCase()));if(!ue.length&&!de)return null;const Se=ue.filter($e=>z[w].has($e.id)).length,Ae=je[w];return l.jsxs("div",{className:"bg-dark-900/50 rounded-lg border border-dark-700 overflow-hidden",children:[l.jsxs("div",{className:"flex items-center justify-between px-3 py-2 cursor-pointer hover:bg-dark-700/50 select-none",onClick:()=>Te($e=>({...$e,[w]:!$e[w]})),children:[l.jsxs("div",{className:"flex items-center gap-2",children:[Ae?l.jsx(No,{size:14,className:"text-gray-500"}):l.jsx(jo,{size:14,className:"text-gray-500"}),l.jsx("span",{className:"text-sm font-medium",children:$}),l.jsxs("span",{className:"text-xs text-gray-500",children:["(",Se,"/",ue.length," sel.)"]})]}),l.jsxs("div",{className:"flex gap-2",onClick:$e=>$e.stopPropagation(),children:[l.jsx("button",{onClick:()=>$r(w,ue),className:"text-xs text-primary-400 hover:text-primary-300 px-2 py-0.5 rounded hover:bg-dark-600",children:"Todo"}),l.jsx("button",{onClick:()=>sr(w),className:"text-xs text-gray-500 hover:text-gray-300 px-2 py-0.5 rounded hover:bg-dark-600",children:"Nada"})]})]}),!Ae&&l.jsx("div",{className:"grid grid-cols-2 gap-0.5 p-2 border-t border-dark-700 max-h-64 overflow-y-auto",children:ue.length===0?l.jsx("div",{className:"col-span-2 text-center text-gray-500 text-xs py-3",children:"Sin resultados"}):ue.map($e=>l.jsxs("label",{className:"flex items-center gap-2 px-2 py-1 rounded hover:bg-dark-700 cursor-pointer text-sm",children:[l.jsx("input",{type:"checkbox",checked:z[w].has($e.id),onChange:()=>Is(w,$e.id),className:"shrink-0"}),l.jsx("span",{className:"truncate text-xs",children:$e.name})]},$e.id))})]},w)})}),l.jsxs("div",{className:"p-4 border-t border-dark-700 flex gap-2 justify-end shrink-0",children:[l.jsx("button",{onClick:()=>M(null),className:"bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm",children:"Cancelar"}),l.jsxs("button",{onClick:Ms,disabled:on===0,className:"bg-primary-500 hover:bg-primary-600 disabled:opacity-40 px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2",children:[l.jsx(Ge,{size:14}),"Importar ",on," ",on===1?"categoría":"categorías"]})]})]})]})}),D&&l.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 w-full max-w-lg flex flex-col max-h-[80vh]",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between shrink-0",children:[l.jsxs("div",{children:[l.jsxs("h2",{className:"font-semibold",children:["Novedades — ",l.jsx("span",{className:"text-primary-400",children:D.name})]}),!ee&&l.jsx("p",{className:"text-xs text-gray-500 mt-0.5",children:b.length===0?"No hay categorías nuevas":`${b.length} categorías nuevas sin sincronizar`})]}),l.jsx("button",{onClick:()=>U(null),className:"text-gray-500 hover:text-white",children:"✕"})]}),ee?l.jsx("div",{className:"flex-1 flex items-center justify-center p-10",children:l.jsx(Ge,{size:22,className:"animate-spin text-gray-400"})}):b.length===0?l.jsx("div",{className:"flex-1 flex items-center justify-center p-10 text-gray-500 text-sm",children:"Todo está actualizado ✓"}):l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"p-3 border-b border-dark-700 shrink-0",children:[l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:ye,onChange:w=>Ne(w.target.value),placeholder:"Buscar...",className:"w-full bg-dark-700 border border-dark-600 rounded-lg pl-9 pr-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]}),l.jsxs("div",{className:"flex gap-2 mt-2",children:[l.jsx("button",{onClick:()=>pe(new Set(Qt.map(w=>w.id+"_"+w.type))),className:"text-xs text-primary-400 hover:text-primary-300 px-2 py-0.5 rounded hover:bg-dark-600",children:"Seleccionar todo"}),l.jsx("button",{onClick:()=>pe(new Set),className:"text-xs text-gray-500 hover:text-gray-300 px-2 py-0.5 rounded hover:bg-dark-600",children:"Ninguna"}),l.jsxs("span",{className:"text-xs text-gray-600 ml-auto self-center",children:[te.size," seleccionadas"]})]})]}),l.jsx("div",{className:"overflow-y-auto flex-1 p-3 space-y-1",children:Qt.map(w=>{const $=w.id+"_"+w.type;return l.jsxs("label",{className:"flex items-center gap-3 px-3 py-2 rounded-lg hover:bg-dark-700 cursor-pointer",children:[l.jsx("input",{type:"checkbox",checked:te.has($),onChange:()=>{pe(ue=>{const Se=new Set(ue);return Se.has($)?Se.delete($):Se.add($),Se})},className:"shrink-0"}),l.jsx("span",{className:"text-sm flex-1 truncate",children:w.name}),l.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded border ${Wr[w.type]}`,children:Hr[w.type]})]},$)})}),l.jsxs("div",{className:"p-4 border-t border-dark-700 flex gap-2 justify-end shrink-0",children:[l.jsx("button",{onClick:()=>U(null),className:"bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm",children:"Cancelar"}),l.jsxs("button",{onClick:An,disabled:te.size===0,className:"bg-primary-500 hover:bg-primary-600 disabled:opacity-40 px-4 py-2 rounded-lg text-sm font-medium flex items-center gap-2",children:[l.jsx(Ge,{size:14}),"Importar ",te.size," ",te.size===1?"categoría":"categorías"]})]})]})]})}),ze&&l.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 w-full max-w-lg",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between",children:[l.jsxs("h2",{className:"font-semibold",children:["Editar proveedor — ",l.jsx("span",{className:"text-primary-400",children:ze.name})]}),l.jsx("button",{onClick:()=>Ee(null),className:"text-gray-500 hover:text-white",children:"✕"})]}),l.jsx("div",{className:"p-4 space-y-3",children:l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsx(Jn,{label:"Nombre",value:q.name,onChange:w=>ge($=>({...$,name:w})),required:!0}),l.jsx(Jn,{label:"URL base",value:q.base_url,onChange:w=>ge($=>({...$,base_url:w})),required:!0}),l.jsx(Jn,{label:"Usuario",value:q.username,onChange:w=>ge($=>({...$,username:w})),required:!0}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Contraseña (vacío = no cambiar)"}),l.jsx("input",{type:"password",value:q.password,onChange:w=>ge($=>({...$,password:w.target.value})),placeholder:"••••••••",className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Conexiones máx."}),l.jsx("input",{type:"number",min:1,max:100,value:q.max_connections,onChange:w=>ge($=>({...$,max_connections:+w.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Auto-sincronización"}),l.jsx("select",{value:q.auto_sync_hours,onChange:w=>ge($=>({...$,auto_sync_hours:+w.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",children:Yd.map(w=>l.jsx("option",{value:w.value,children:w.label},w.value))})]})]})}),l.jsxs("div",{className:"p-4 border-t border-dark-700 flex gap-2 justify-end",children:[l.jsx("button",{onClick:()=>Ee(null),className:"bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm",children:"Cancelar"}),l.jsx("button",{onClick:Fs,className:"bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:"Guardar"})]})]})}),l.jsxs("div",{className:"space-y-3",children:[s.map(w=>l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl overflow-hidden",children:[l.jsxs("div",{className:"p-4 flex items-center justify-between gap-4",children:[l.jsxs("div",{className:"min-w-0 flex-1",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"font-semibold",children:w.name}),w.auto_sync_hours>0&&l.jsxs("span",{className:"text-xs bg-dark-700 text-gray-400 px-1.5 py-0.5 rounded",children:["Auto ",w.auto_sync_hours,"h"]})]}),l.jsxs("div",{className:"flex items-center gap-2 flex-wrap mt-0.5",children:[l.jsxs("span",{className:"text-xs text-gray-500 truncate",children:[w.base_url," • ",w.username," • ",w.max_connections," conex."]}),(()=>{const $=Cg(w.expiry_date);return $?l.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded ${$.cls}`,children:$.label}):null})()]}),w.last_sync_at&&l.jsxs("div",{className:"text-xs text-gray-600 mt-0.5",children:["Último sync: ",new Date(w.last_sync_at).toLocaleString("es-ES")]}),L[w.id]!==void 0&&l.jsx("div",{className:`text-xs mt-0.5 ${L[w.id]?"text-green-400":"text-red-400"}`,children:L[w.id]?"✓ Conexión OK":"✗ Sin conexión"}),x[w.id]&&l.jsxs("div",{className:`text-xs mt-1 ${x[w.id].startsWith("✓")?"text-green-400":x[w.id].startsWith("Error")?"text-red-400":"text-blue-400"}`,children:[m.has(w.id)&&l.jsx(Ge,{size:10,className:"inline animate-spin mr-1"}),x[w.id],j[w.id]&&m.has(w.id)&&l.jsxs("span",{className:"text-gray-500 ml-1",children:["(",Object.entries(j[w.id]).filter(([,$])=>$>0).map(([$,ue])=>`${ue} ${$}`).join(", "),")"]})]})]}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[l.jsx("button",{onClick:()=>an(w.id),disabled:O===w.id,title:"Probar conexión",className:"p-2 rounded-lg bg-dark-700 hover:bg-dark-600 text-gray-400 hover:text-blue-400 transition-colors",children:O===w.id?l.jsx(Ge,{size:15,className:"animate-spin"}):l.jsx(fa,{size:15})}),w.last_sync_at&&l.jsxs("button",{onClick:()=>$s(w),title:"Ver novedades del proveedor",className:"relative p-2 rounded-lg bg-dark-700 hover:bg-dark-600 text-gray-400 hover:text-yellow-400 transition-colors",children:[l.jsx(gf,{size:15}),(we[w.id]??0)>0&&l.jsx("span",{className:"absolute -top-1 -right-1 bg-yellow-500 text-black text-[10px] font-bold rounded-full w-4 h-4 flex items-center justify-center",children:we[w.id]>9?"9+":we[w.id]})]}),l.jsxs("button",{onClick:()=>Us(w),disabled:m.has(w.id),title:"Sincronizar canales",className:"flex items-center gap-1.5 px-3 py-1.5 rounded-lg bg-dark-700 hover:bg-dark-600 text-xs text-gray-300 hover:text-white transition-colors disabled:opacity-50",children:[l.jsx(Ge,{size:13,className:m.has(w.id)?"animate-spin":""}),m.has(w.id)?"Sincronizando...":"Sync canales"]}),l.jsx("button",{onClick:()=>Ir(w),title:"Editar proveedor",className:"p-2 rounded-lg bg-dark-700 hover:bg-dark-600 text-gray-400 hover:text-yellow-400 transition-colors",children:l.jsx(kf,{size:15})}),l.jsx("button",{onClick:()=>va(w.id),title:"Gestionar dominios de failover",className:`p-2 rounded-lg bg-dark-700 hover:bg-dark-600 transition-colors ${F.has(w.id)?"text-primary-400":"text-gray-400 hover:text-primary-400"}`,children:F.has(w.id)?l.jsx(jo,{size:15}):l.jsx(No,{size:15})}),l.jsx("button",{onClick:()=>On(w.id),className:"p-2 rounded-lg bg-dark-700 hover:bg-red-900/40 text-gray-500 hover:text-red-400 transition-colors",children:l.jsx(rn,{size:15})})]})]}),F.has(w.id)&&l.jsxs("div",{className:"border-t border-dark-700 bg-dark-900/40 p-4 space-y-2",children:[l.jsxs("div",{className:"flex items-center justify-between mb-2",children:[l.jsx("span",{className:"text-xs font-semibold text-gray-400 uppercase tracking-wider",children:"Dominios (failover)"}),l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("button",{onClick:()=>wa(w.id),disabled:Fr.has(w.id),className:"flex items-center gap-1 text-xs px-2 py-1 rounded bg-dark-700 hover:bg-dark-600 text-gray-400 hover:text-blue-400 transition-colors disabled:opacity-50",children:[l.jsx(Ge,{size:11,className:Fr.has(w.id)?"animate-spin":""}),"Verificar todos"]}),l.jsxs("button",{onClick:()=>{Ce(w.id),Le({url:"",priority:10,is_active:!0})},className:"flex items-center gap-1 text-xs px-2 py-1 rounded bg-dark-700 hover:bg-dark-600 text-gray-400 hover:text-green-400 transition-colors",children:[l.jsx(tr,{size:11}),"Añadir URL"]})]})]}),(w.urls??[]).length===0&&ke!==w.id&&l.jsx("div",{className:"text-xs text-gray-600 text-center py-2",children:"No hay URLs adicionales configuradas"}),(w.urls??[]).map($=>l.jsxs("div",{className:"flex items-center gap-3 bg-dark-800 rounded-lg px-3 py-2",children:[l.jsx("div",{className:"flex-1 min-w-0",children:l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"text-xs font-mono text-gray-300 truncate",children:$.url}),$.priority===0&&l.jsx("span",{className:"text-[10px] bg-primary-900/40 text-primary-400 px-1 rounded",children:"primaria"}),!$.is_active&&l.jsx("span",{className:"text-[10px] bg-dark-600 text-gray-500 px-1 rounded",children:"inactiva"})]})}),l.jsx("div",{className:"shrink-0",children:Br($)}),l.jsx("button",{onClick:()=>Vs(w.id,$.id),className:"p-1 rounded text-gray-600 hover:text-red-400 transition-colors",children:l.jsx(rn,{size:12})})]},$.id)),ke===w.id&&l.jsxs("div",{className:"bg-dark-800 rounded-lg p-3 space-y-2 border border-dark-600",children:[l.jsxs("div",{className:"grid grid-cols-3 gap-2",children:[l.jsxs("div",{className:"col-span-2",children:[l.jsx("label",{className:"block text-[10px] text-gray-500 mb-1",children:"URL base (ej: http://mirror.com:8080)"}),l.jsx("input",{value:De.url,onChange:$=>Le(ue=>({...ue,url:$.target.value})),placeholder:"http://...",className:"w-full bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs focus:outline-none focus:border-primary-500"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-[10px] text-gray-500 mb-1",children:"Prioridad (0=más alta)"}),l.jsx("input",{type:"number",min:0,max:999,value:De.priority,onChange:$=>Le(ue=>({...ue,priority:+$.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded px-2 py-1.5 text-xs"})]})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("label",{className:"flex items-center gap-1.5 text-xs text-gray-400 cursor-pointer",children:[l.jsx("input",{type:"checkbox",checked:De.is_active,onChange:$=>Le(ue=>({...ue,is_active:$.target.checked}))}),"Activa"]}),l.jsxs("div",{className:"flex gap-2 ml-auto",children:[l.jsx("button",{onClick:()=>Ce(null),className:"text-xs px-2 py-1 rounded bg-dark-700 hover:bg-dark-600 text-gray-400",children:"Cancelar"}),l.jsx("button",{onClick:()=>Bs(w.id),disabled:!De.url,className:"text-xs px-2 py-1 rounded bg-primary-500 hover:bg-primary-600 disabled:opacity-40 font-medium",children:"Guardar"})]})]})]})]})]},w.id)),s.length===0&&l.jsx("div",{className:"bg-dark-800 border border-dark-700 border-dashed rounded-xl p-10 text-center text-gray-500 text-sm",children:"No hay proveedores. Añade uno para empezar."})]})]})}function Jn({label:s,value:a,onChange:i,required:c}){return l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:s}),l.jsx("input",{value:a,onChange:d=>i(d.target.value),required:c,className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]})}const Pg={live:"Canales en directo",movie:"Películas",series:"Series"};function Rg(){const[s,a]=v.useState([]),[i,c]=v.useState(!1),[d,f]=v.useState(null),[m,h]=v.useState(null),[x,y]=v.useState(null),[j,_]=v.useState([]),[O,B]=v.useState(new Set),[L,P]=v.useState([]),[N,A]=v.useState(new Set),[M,K]=v.useState(""),[Q,me]=v.useState([]),[fe,z]=v.useState([]),[ae,de]=v.useState({username:"",password:"",max_connections:1,expiry_date:"",is_active:!0,is_priority:!1});async function Y(){const{data:F}=await X.get("/users/");a(F)}v.useEffect(()=>{Y()},[]);async function je(F){F.preventDefault();const ne={...ae,expiry_date:ae.expiry_date||null};d?await X.put(`/users/${d.id}`,ne):await X.post("/users/",ne),Te(),Y()}function Te(){de({username:"",password:"",max_connections:1,expiry_date:"",is_active:!0,is_priority:!1}),c(!1),f(null)}function ze(F){var ne;de({username:F.username,password:"",max_connections:F.max_connections,expiry_date:((ne=F.expiry_date)==null?void 0:ne.split("T")[0])||"",is_active:F.is_active,is_priority:F.is_priority}),f(F),c(!0)}async function Ee(F){confirm("¿Eliminar usuario?")&&(await X.delete(`/users/${F}`),Y())}async function q(F){await X.put(`/users/${F.id}`,{is_priority:!F.is_priority}),Y()}async function ge(F){h(F),K("");const[ne,ke,Ce,De]=await Promise.all([X.get("/catalogs/grouped").then(Le=>Le.data),X.get(`/users/${F.id}/catalog`).then(Le=>Le.data),X.get("/custom-categories/").then(Le=>Le.data),X.get(`/users/${F.id}/custom-catalog`).then(Le=>Le.data)]);_(ne),B(new Set(ke.map(Le=>Le.category_id))),P(Ce),A(new Set(De))}function D(F){return F.category_ids.some(ne=>O.has(ne))}function U(F,ne){B(ke=>{const Ce=new Set(ke);return ne?F.category_ids.forEach(De=>Ce.add(De)):F.category_ids.forEach(De=>Ce.delete(De)),Ce})}function ee(F){B(ke=>{const Ce=new Set(ke);return F.forEach(De=>De.category_ids.forEach(Le=>Ce.add(Le))),Ce});const ne=L.filter(ke=>!M||ke.name.toLowerCase().includes(M.toLowerCase()));A(ke=>{const Ce=new Set(ke);return ne.forEach(De=>Ce.add(De.id)),Ce})}function G(F){B(ke=>{const Ce=new Set(ke);return F.forEach(De=>De.category_ids.forEach(Le=>Ce.delete(Le))),Ce});const ne=L.filter(ke=>!M||ke.name.toLowerCase().includes(M.toLowerCase()));A(ke=>{const Ce=new Set(ke);return ne.forEach(De=>Ce.delete(De.id)),Ce})}async function b(){m&&(await Promise.all([X.post(`/users/${m.id}/catalog`,Array.from(O)),X.post(`/users/${m.id}/custom-catalog`,Array.from(N))]),h(null))}async function I(F){y(F);const[ne,ke]=await Promise.all([X.get("/providers/").then(Ce=>Ce.data),X.get(`/users/${F.id}/providers`).then(Ce=>Ce.data)]);me(ne),z(ke)}async function te(F){if(!x)return;await X.post(`/users/${x.id}/providers`,{provider_account_id:F,priority:fe.length});const{data:ne}=await X.get(`/users/${x.id}/providers`);z(ne)}async function pe(F){if(!x)return;await X.delete(`/users/${x.id}/providers/${F}`);const{data:ne}=await X.get(`/users/${x.id}/providers`);z(ne)}const ye=new Set(fe.map(F=>F.provider_account_id)),Ne=j.filter(F=>!M||F.name.toLowerCase().includes(M.toLowerCase())),we=L.filter(F=>!M||F.name.toLowerCase().includes(M.toLowerCase())),oe=j.filter(F=>D(F)).length+N.size;return l.jsxs("div",{className:"p-6 space-y-5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Usuarios"}),l.jsxs("button",{onClick:()=>c(F=>!F),className:"flex items-center gap-2 bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium transition-colors",children:[l.jsx(tr,{size:16})," Nuevo usuario"]})]}),i&&l.jsxs("form",{onSubmit:je,className:"bg-dark-800 border border-dark-700 rounded-xl p-5 space-y-3",children:[l.jsx("h3",{className:"font-semibold text-sm",children:d?"Editar usuario":"Nuevo usuario"}),l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Usuario"}),l.jsx("input",{value:ae.username,onChange:F=>de(ne=>({...ne,username:F.target.value})),required:!0,disabled:!!d,className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsxs("label",{className:"block text-xs text-gray-500 mb-1",children:["Contraseña ",d&&"(dejar vacío para no cambiar)"]}),l.jsx("input",{type:"password",value:ae.password,onChange:F=>de(ne=>({...ne,password:F.target.value})),required:!d,className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Max. conexiones simultáneas"}),l.jsx("input",{type:"number",min:1,value:ae.max_connections,onChange:F=>de(ne=>({...ne,max_connections:+F.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Fecha expiración"}),l.jsx("input",{type:"date",value:ae.expiry_date,onChange:F=>de(ne=>({...ne,expiry_date:F.target.value})),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{className:"flex items-center gap-4 col-span-2",children:[l.jsxs("label",{className:"flex items-center gap-2 text-sm cursor-pointer",children:[l.jsx("input",{type:"checkbox",checked:ae.is_active,onChange:F=>de(ne=>({...ne,is_active:F.target.checked}))}),"Activo"]}),l.jsxs("label",{className:"flex items-center gap-2 text-sm cursor-pointer",children:[l.jsx("input",{type:"checkbox",checked:ae.is_priority,onChange:F=>de(ne=>({...ne,is_priority:F.target.checked}))}),l.jsx(Pn,{size:13,className:"text-yellow-400"}),"Usuario prioritario"]})]})]}),l.jsxs("div",{className:"flex gap-2",children:[l.jsx("button",{type:"submit",className:"bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:"Guardar"}),l.jsx("button",{type:"button",onClick:Te,className:"bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm",children:"Cancelar"})]})]}),m&&l.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 w-full max-w-2xl max-h-[85vh] flex flex-col",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between shrink-0",children:[l.jsxs("div",{children:[l.jsxs("h2",{className:"font-semibold",children:["Catálogo de ",l.jsx("span",{className:"text-primary-400",children:m.username})]}),l.jsxs("p",{className:"text-xs text-gray-500 mt-0.5",children:[oe," de ",j.length+L.length," categorías seleccionadas"]})]}),l.jsx("button",{onClick:()=>h(null),className:"text-gray-500 hover:text-white",children:"✕"})]}),l.jsxs("div",{className:"p-3 border-b border-dark-700 shrink-0 space-y-2",children:[l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:M,onChange:F=>K(F.target.value),placeholder:"Buscar categoría...",className:"w-full bg-dark-700 border border-dark-600 rounded-lg pl-9 pr-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]}),l.jsxs("div",{className:"flex gap-2",children:[l.jsx("button",{onClick:()=>ee(Ne),className:"text-xs px-3 py-1 rounded-lg bg-primary-900/40 hover:bg-primary-900/70 text-primary-300 border border-primary-800 transition-colors",children:"Seleccionar todo"}),l.jsx("button",{onClick:()=>G(Ne),className:"text-xs px-3 py-1 rounded-lg bg-dark-700 hover:bg-dark-600 text-gray-400 border border-dark-600 transition-colors",children:"Ninguna"})]})]}),l.jsxs("div",{className:"overflow-y-auto flex-1 p-4 space-y-4",children:[["live","movie","series"].map(F=>{const ne=Ne.filter(ke=>ke.type===F);return ne.length?l.jsxs("div",{children:[l.jsxs("h3",{className:"text-xs text-gray-500 uppercase tracking-wider mb-2 flex items-center justify-between",children:[l.jsx("span",{children:Pg[F]}),l.jsxs("span",{className:"normal-case text-gray-600",children:[ne.filter(ke=>D(ke)).length,"/",ne.length]})]}),l.jsx("div",{className:"grid grid-cols-2 gap-1",children:ne.map(ke=>l.jsxs("label",{className:`flex items-center gap-2 text-sm p-2 rounded-lg cursor-pointer transition-colors ${D(ke)?"bg-primary-900/20 hover:bg-primary-900/30":"hover:bg-dark-700"}`,children:[l.jsx("input",{type:"checkbox",checked:D(ke),onChange:Ce=>U(ke,Ce.target.checked),className:"shrink-0"}),l.jsx("span",{className:"truncate",children:ke.name}),ke.provider_count>0&&l.jsxs("span",{className:`shrink-0 text-xs px-1.5 py-0.5 rounded ml-auto font-medium ${ke.provider_count>1?"bg-green-900/50 text-green-400":"bg-dark-600 text-gray-500"}`,children:[ke.provider_count,"p"]})]},ke.name))})]},F):null}),Ne.length===0&&we.length===0&&l.jsx("div",{className:"text-center text-gray-500 text-sm py-8",children:"Sin resultados"}),we.length>0&&l.jsxs("div",{children:[l.jsxs("h3",{className:"text-xs text-gray-500 uppercase tracking-wider mb-2 flex items-center gap-2",children:[l.jsx(Pn,{size:11,className:"text-yellow-400"}),l.jsx("span",{children:"Categorías personalizadas"}),l.jsxs("span",{className:"normal-case text-gray-600",children:[we.filter(F=>N.has(F.id)).length,"/",we.length]})]}),l.jsx("div",{className:"grid grid-cols-2 gap-1",children:we.map(F=>l.jsxs("label",{className:`flex items-center gap-2 text-sm p-2 rounded-lg cursor-pointer transition-colors ${N.has(F.id)?"bg-yellow-900/20 hover:bg-yellow-900/30":"hover:bg-dark-700"}`,children:[l.jsx("input",{type:"checkbox",checked:N.has(F.id),onChange:ne=>{A(ke=>{const Ce=new Set(ke);return ne.target.checked?Ce.add(F.id):Ce.delete(F.id),Ce})},className:"shrink-0"}),l.jsx("span",{className:"truncate",children:F.name}),l.jsx(Pn,{size:10,className:"shrink-0 text-yellow-500 ml-auto"})]},F.id))})]})]}),l.jsxs("div",{className:"p-4 border-t border-dark-700 flex gap-2 justify-end shrink-0",children:[l.jsx("button",{onClick:()=>h(null),className:"bg-dark-700 px-4 py-2 rounded-lg text-sm",children:"Cancelar"}),l.jsx("button",{onClick:b,className:"bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:"Guardar catálogo"})]})]})}),x&&l.jsx("div",{className:"fixed inset-0 bg-black/70 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 rounded-xl border border-dark-700 w-full max-w-md flex flex-col",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between",children:[l.jsxs("h2",{className:"font-semibold",children:["Proveedores preferidos — ",l.jsx("span",{className:"text-primary-400",children:x.username})]}),l.jsx("button",{onClick:()=>y(null),className:"text-gray-500 hover:text-white",children:"✕"})]}),l.jsxs("div",{className:"p-4 space-y-2",children:[l.jsx("p",{className:"text-xs text-gray-500 mb-3",children:"Los proveedores marcados se intentan primero al asignar un slot. Si ninguno está disponible, se usa cualquiera con slot libre."}),Q.map(F=>{const ne=ye.has(F.id);return l.jsxs("div",{className:`flex items-center justify-between p-3 rounded-lg border ${ne?"border-primary-700 bg-primary-900/20":"border-dark-600 bg-dark-700"}`,children:[l.jsx("span",{className:"text-sm",children:F.name}),l.jsx("button",{onClick:()=>ne?pe(F.id):te(F.id),className:`text-xs px-3 py-1 rounded-lg font-medium transition-colors ${ne?"bg-primary-600 hover:bg-red-700 text-white":"bg-dark-600 hover:bg-primary-700 text-gray-300 hover:text-white"}`,children:ne?"Quitar":"Preferido"})]},F.id)}),Q.length===0&&l.jsx("div",{className:"text-center text-gray-500 text-sm py-4",children:"No hay proveedores configurados"})]}),l.jsx("div",{className:"p-4 border-t border-dark-700 flex justify-end",children:l.jsx("button",{onClick:()=>y(null),className:"bg-dark-700 px-4 py-2 rounded-lg text-sm",children:"Cerrar"})})]})}),l.jsx("div",{className:"bg-dark-800 border border-dark-700 rounded-xl overflow-hidden",children:l.jsxs("table",{className:"w-full text-sm",children:[l.jsx("thead",{className:"border-b border-dark-700 text-xs text-gray-500",children:l.jsxs("tr",{children:[l.jsx("th",{className:"text-left px-4 py-3",children:"Usuario"}),l.jsx("th",{className:"text-left px-4 py-3",children:"Conexiones"}),l.jsx("th",{className:"text-left px-4 py-3",children:"Expiración"}),l.jsx("th",{className:"text-left px-4 py-3",children:"Estado"}),l.jsx("th",{className:"text-left px-4 py-3",children:"Acciones"})]})}),l.jsxs("tbody",{children:[s.map(F=>l.jsxs("tr",{className:"border-b border-dark-700 hover:bg-dark-700/30",children:[l.jsx("td",{className:"px-4 py-3",children:l.jsxs("div",{className:"flex items-center gap-1.5",children:[F.is_priority&&l.jsx(Pn,{size:12,className:"text-yellow-400 shrink-0"}),l.jsx("span",{className:"font-mono",children:F.username})]})}),l.jsx("td",{className:"px-4 py-3",children:F.max_connections}),l.jsx("td",{className:"px-4 py-3 text-gray-400",children:F.expiry_date?new Date(F.expiry_date).toLocaleDateString("es-ES"):"—"}),l.jsx("td",{className:"px-4 py-3",children:l.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${F.is_active?"bg-green-900/40 text-green-400":"bg-red-900/40 text-red-400"}`,children:F.is_active?"Activo":"Inactivo"})}),l.jsx("td",{className:"px-4 py-3",children:l.jsxs("div",{className:"flex items-center gap-1",children:[l.jsx("button",{onClick:()=>ge(F),title:"Asignar catálogo",className:"p-1.5 rounded hover:bg-dark-600 text-gray-400 hover:text-blue-400",children:l.jsx(wf,{size:14})}),l.jsx("button",{onClick:()=>I(F),title:"Proveedores preferidos",className:"p-1.5 rounded hover:bg-dark-600 text-gray-400 hover:text-purple-400",children:l.jsx(zo,{size:14})}),l.jsx("button",{onClick:()=>q(F),title:F.is_priority?"Quitar prioridad":"Hacer prioritario",className:`p-1.5 rounded hover:bg-dark-600 transition-colors ${F.is_priority?"text-yellow-400":"text-gray-400 hover:text-yellow-400"}`,children:l.jsx(Pn,{size:14})}),l.jsx("button",{onClick:()=>ze(F),title:"Editar",className:"p-1.5 rounded hover:bg-dark-600 text-gray-400 hover:text-yellow-400",children:l.jsx(kf,{size:14})}),l.jsx("button",{onClick:()=>Ee(F.id),title:"Eliminar",className:"p-1.5 rounded hover:bg-dark-600 text-gray-400 hover:text-red-400",children:l.jsx(rn,{size:14})})]})})]},F.id)),s.length===0&&l.jsx("tr",{children:l.jsx("td",{colSpan:5,className:"px-4 py-8 text-center text-gray-500",children:"No hay usuarios"})})]})]})})]})}const Tg={live:"Directo",movie:"Películas",series:"Series"},Lg={live:"bg-blue-900/40 text-blue-300",movie:"bg-purple-900/40 text-purple-300",series:"bg-green-900/40 text-green-300"};function Og(){const[s,a]=v.useState([]),[i,c]=v.useState(""),[d,f]=v.useState("");v.useEffect(()=>{X.get("/catalogs/grouped").then(h=>a(h.data))},[]);const m=s.filter(h=>{const x=!d||h.type===d,y=!i||h.name.toLowerCase().includes(i.toLowerCase());return x&&y});return l.jsxs("div",{className:"p-6 space-y-5",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Catálogos de Categorías"}),l.jsx("p",{className:"text-sm text-gray-400",children:"Categorías importadas de los proveedores. El badge indica cuántos proveedores cubren cada categoría (= streams simultáneos posibles). Asígnalas a usuarios desde la sección Usuarios."}),l.jsxs("div",{className:"flex gap-3",children:[l.jsxs("div",{className:"relative flex-1 max-w-sm",children:[l.jsx(Kt,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:i,onChange:h=>c(h.target.value),placeholder:"Buscar categoría...",className:"w-full bg-dark-800 border border-dark-700 rounded-lg pl-8 pr-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]}),l.jsxs("select",{value:d,onChange:h=>f(h.target.value),className:"bg-dark-800 border border-dark-700 rounded-lg px-3 py-2 text-sm focus:outline-none",children:[l.jsx("option",{value:"",children:"Todos los tipos"}),l.jsx("option",{value:"live",children:"Directo"}),l.jsx("option",{value:"movie",children:"Películas"}),l.jsx("option",{value:"series",children:"Series"})]})]}),l.jsxs("div",{className:"grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 gap-3",children:[m.map(h=>l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl p-3 flex items-center gap-2",children:[l.jsx("span",{className:"text-sm truncate flex-1 min-w-0",title:h.name,children:h.name}),l.jsxs("div",{className:"flex items-center gap-1.5 shrink-0",children:[h.provider_count>0&&l.jsxs("span",{title:`${h.provider_count} proveedor${h.provider_count!==1?"es":""} — ${h.provider_count} stream${h.provider_count!==1?"s":""} simultáneo${h.provider_count!==1?"s":""} posible${h.provider_count!==1?"s":""}`,className:`text-xs px-1.5 py-0.5 rounded font-medium ${h.provider_count>1?"bg-green-900/50 text-green-400":"bg-dark-600 text-gray-500"}`,children:[h.provider_count,"p"]}),l.jsx("span",{className:`text-xs px-2 py-0.5 rounded-full ${Lg[h.type]}`,children:Tg[h.type]})]})]},h.name+h.type)),m.length===0&&l.jsx("div",{className:"col-span-full bg-dark-800 border border-dark-700 border-dashed rounded-xl p-8 text-center text-gray-500 text-sm",children:s.length===0?"Sincroniza un proveedor para ver las categorías":"No se encontraron categorías"})]}),l.jsxs("p",{className:"text-xs text-gray-600",children:[m.length," categorías mostradas de ",s.length," totales"]})]})}function zg(){const[s,a]=v.useState([]),[i,c]=v.useState(!1),[d,f]=v.useState({name:"",url:""}),[m,h]=v.useState(!1);async function x(){const{data:O}=await X.get("/epg/");a(O)}v.useEffect(()=>{x()},[]);async function y(O){O.preventDefault(),await X.post("/epg/",d),f({name:"",url:""}),c(!1),x()}async function j(O){confirm("¿Eliminar fuente EPG?")&&(await X.delete(`/epg/${O}`),x())}async function _(){h(!0);try{await X.post("/epg/refresh"),alert("EPG actualización iniciada en segundo plano")}finally{h(!1)}}return l.jsxs("div",{className:"p-6 space-y-5",children:[l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Gestión EPG"}),l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("button",{onClick:_,disabled:m,className:"flex items-center gap-2 bg-dark-700 hover:bg-dark-600 px-4 py-2 rounded-lg text-sm font-medium transition-colors",children:[l.jsx(Ge,{size:15,className:m?"animate-spin":""}),"Actualizar EPG"]}),l.jsxs("button",{onClick:()=>c(O=>!O),className:"flex items-center gap-2 bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:[l.jsx(tr,{size:16})," Añadir fuente"]})]})]}),l.jsxs("div",{className:"bg-dark-800 border border-primary-500/20 rounded-xl p-4 text-sm text-gray-400",children:[l.jsx("strong",{className:"text-gray-200",children:"Endpoint EPG para tus apps IPTV:"}),l.jsx("div",{className:"font-mono text-xs mt-1 bg-dark-700 rounded p-2 text-green-400",children:"http://10.10.10.234/xmltv.php?username=USUARIO&password=CONTRASEÑA"})]}),i&&l.jsxs("form",{onSubmit:y,className:"bg-dark-800 border border-dark-700 rounded-xl p-5 space-y-3",children:[l.jsx("h3",{className:"font-semibold text-sm",children:"Nueva fuente XMLTV"}),l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"Nombre"}),l.jsx("input",{value:d.name,onChange:O=>f(B=>({...B,name:O.target.value})),required:!0,className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"block text-xs text-gray-500 mb-1",children:"URL XMLTV (o del proveedor)"}),l.jsx("input",{value:d.url,onChange:O=>f(B=>({...B,url:O.target.value})),required:!0,placeholder:"http://proveedor.com/xmltv.php?username=X&password=Y",className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm"})]})]}),l.jsxs("div",{className:"flex gap-2",children:[l.jsx("button",{type:"submit",className:"bg-primary-500 hover:bg-primary-600 px-4 py-2 rounded-lg text-sm font-medium",children:"Guardar"}),l.jsx("button",{type:"button",onClick:()=>c(!1),className:"bg-dark-700 px-4 py-2 rounded-lg text-sm",children:"Cancelar"})]})]}),l.jsxs("div",{className:"space-y-3",children:[s.map(O=>l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl p-4 flex items-center justify-between gap-4",children:[l.jsxs("div",{children:[l.jsx("div",{className:"font-semibold",children:O.name}),l.jsx("div",{className:"text-xs text-gray-500 truncate max-w-xl",children:O.url}),O.last_fetched_at&&l.jsxs("div",{className:"text-xs text-gray-600 mt-0.5",children:["Última actualización: ",new Date(O.last_fetched_at).toLocaleString("es-ES")]})]}),l.jsx("button",{onClick:()=>j(O.id),className:"p-2 rounded-lg bg-dark-700 hover:bg-red-900/40 text-gray-500 hover:text-red-400 transition-colors",children:l.jsx(rn,{size:15})})]},O.id)),s.length===0&&l.jsx("div",{className:"bg-dark-800 border border-dark-700 border-dashed rounded-xl p-8 text-center text-gray-500 text-sm",children:"No hay fuentes EPG configuradas"})]})]})}const ho={live:"Directo",movie:"Película",series:"Serie"},Zd={live:Tr,movie:Gn,series:yf},ea={live:"bg-blue-500/20 text-blue-400",movie:"bg-purple-500/20 text-purple-400",series:"bg-orange-500/20 text-orange-400"};function Ag(){const[s,a]=v.useState([]),[i,c]=v.useState(null),[d,f]=v.useState([]),[m,h]=v.useState(""),[x,y]=v.useState(""),[j,_]=v.useState([]),[O,B]=v.useState(!1),[L,P]=v.useState(!1),[N,A]=v.useState(""),[M,K]=v.useState("live"),[Q,me]=v.useState(!1),fe=v.useCallback(async()=>{const{data:q}=await X.get("/custom-categories");a(q)},[]),z=v.useCallback(async q=>{const{data:ge}=await X.get(`/custom-categories/${q.id}/channels`);f(ge)},[]);v.useEffect(()=>{fe()},[fe]),v.useEffect(()=>{i&&z(i)},[i,z]);const ae=q=>{c(q),B(!1),h(""),_([])},de=async()=>{N.trim()&&(await X.post("/custom-categories",{name:N.trim(),type:M}),A(""),P(!1),await fe())},Y=async q=>{confirm(`¿Eliminar categoría "${q.name}"?`)&&(await X.delete(`/custom-categories/${q.id}`),(i==null?void 0:i.id)===q.id&&c(null),await fe())},je=async q=>{await X.patch(`/custom-categories/${q.id}`,{is_visible:!q.is_visible}),await fe(),(i==null?void 0:i.id)===q.id&&c({...q,is_visible:!q.is_visible})},Te=v.useCallback(async(q,ge)=>{if(!q&&!ge){_([]);return}const{data:D}=await X.get("/custom-categories/channels/search",{params:{q,type:ge}});_(D)},[]);v.useEffect(()=>{const q=setTimeout(()=>Te(m,x),300);return()=>clearTimeout(q)},[m,x,Te]);const ze=async q=>{var ge;if(i)try{await X.post(`/custom-categories/${i.id}/channels`,{channel_id:q.id}),await z(i),await fe()}catch(D){((ge=D.response)==null?void 0:ge.status)!==409&&alert("Error al añadir canal")}},Ee=async q=>{i&&(await X.delete(`/custom-categories/${i.id}/channels/${q.item_id}`),await z(i),await fe())};return l.jsxs("div",{className:"flex h-full",children:[l.jsxs("aside",{className:"w-72 border-r border-dark-700 flex flex-col bg-dark-800",children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx(Pn,{size:18,className:"text-yellow-400"}),l.jsx("h2",{className:"font-semibold text-sm",children:"Categorías personalizadas"})]}),l.jsx("button",{onClick:()=>P(!0),className:"p-1.5 rounded-lg bg-primary-500/20 text-primary-400 hover:bg-primary-500/30 transition-colors",children:l.jsx(tr,{size:15})})]}),L&&l.jsxs("div",{className:"p-3 border-b border-dark-700 bg-dark-900 space-y-2",children:[l.jsx("input",{autoFocus:!0,value:N,onChange:q=>A(q.target.value),onKeyDown:q=>q.key==="Enter"&&de(),placeholder:"Nombre de la categoría",className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none focus:border-primary-500"}),l.jsxs("select",{value:M,onChange:q=>K(q.target.value),className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none",children:[l.jsx("option",{value:"live",children:"Directo"}),l.jsx("option",{value:"movie",children:"Película"}),l.jsx("option",{value:"series",children:"Serie"})]}),l.jsxs("div",{className:"flex gap-2",children:[l.jsx("button",{onClick:de,className:"flex-1 bg-primary-500 hover:bg-primary-600 text-white text-xs py-1.5 rounded-lg transition-colors",children:"Crear"}),l.jsx("button",{onClick:()=>P(!1),className:"flex-1 bg-dark-700 hover:bg-dark-600 text-xs py-1.5 rounded-lg transition-colors",children:"Cancelar"})]})]}),l.jsxs("div",{className:"flex-1 overflow-y-auto p-2 space-y-1",children:[s.length===0&&l.jsx("p",{className:"text-xs text-gray-500 text-center py-8",children:"No hay categorías personalizadas"}),s.map(q=>{const ge=Zd[q.type];return l.jsxs("div",{onClick:()=>ae(q),className:Mt("flex items-center gap-2 px-3 py-2 rounded-lg cursor-pointer group transition-colors",(i==null?void 0:i.id)===q.id?"bg-primary-500/20":"hover:bg-dark-700"),children:[l.jsx(ge,{size:14,className:ea[q.type].split(" ")[1]}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsx("p",{className:Mt("text-sm font-medium truncate",(i==null?void 0:i.id)===q.id?"text-primary-300":"text-gray-200"),children:q.name}),l.jsxs("p",{className:"text-xs text-gray-500",children:[ho[q.type]," · ",q.item_count," canales"]})]}),l.jsxs("div",{className:"flex items-center gap-1 opacity-0 group-hover:opacity-100 transition-opacity",onClick:D=>D.stopPropagation(),children:[l.jsx("button",{onClick:()=>je(q),className:Mt("text-xs px-1.5 py-0.5 rounded",q.is_visible?"text-green-400":"text-gray-600"),title:q.is_visible?"Visible (clic para ocultar)":"Oculto (clic para mostrar)",children:q.is_visible?"●":"○"}),l.jsx("button",{onClick:()=>Y(q),className:"text-red-500 hover:text-red-400 p-0.5 rounded",children:l.jsx(rn,{size:12})})]})]},q.id)})]})]}),l.jsx("main",{className:"flex-1 flex flex-col overflow-hidden",children:i?l.jsxs(l.Fragment,{children:[l.jsxs("div",{className:"p-4 border-b border-dark-700 flex items-center justify-between bg-dark-800",children:[l.jsxs("div",{children:[l.jsxs("h2",{className:"font-semibold flex items-center gap-2",children:[(()=>{const q=Zd[i.type];return l.jsx(q,{size:16,className:ea[i.type].split(" ")[1]})})(),i.name,l.jsx("span",{className:Mt("text-xs px-2 py-0.5 rounded-full",ea[i.type]),children:ho[i.type]})]}),l.jsxs("p",{className:"text-xs text-gray-500 mt-0.5",children:[d.length," canales asignados"]})]}),l.jsxs("button",{onClick:()=>B(!O),className:"flex items-center gap-2 px-3 py-1.5 bg-primary-500/20 text-primary-400 hover:bg-primary-500/30 rounded-lg text-sm transition-colors",children:[l.jsx(tr,{size:14})," Añadir canales"]})]}),O&&l.jsxs("div",{className:"border-b border-dark-700 bg-dark-900 p-4 space-y-3",children:[l.jsxs("div",{className:"flex gap-2",children:[l.jsxs("div",{className:"relative flex-1",children:[l.jsx(Kt,{size:14,className:"absolute left-3 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{autoFocus:!0,value:m,onChange:q=>h(q.target.value),placeholder:"Buscar canal...",className:"w-full bg-dark-700 border border-dark-600 rounded-lg pl-9 pr-3 py-2 text-sm focus:outline-none focus:border-primary-500"})]}),l.jsxs("select",{value:x,onChange:q=>y(q.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 text-sm focus:outline-none",children:[l.jsx("option",{value:"",children:"Todos los tipos"}),l.jsx("option",{value:"live",children:"Directo"}),l.jsx("option",{value:"movie",children:"Película"}),l.jsx("option",{value:"series",children:"Serie"})]}),l.jsx("button",{onClick:()=>B(!1),className:"text-gray-500 hover:text-gray-300 p-2",children:l.jsx(Ln,{size:16})})]}),l.jsxs("div",{className:"grid grid-cols-2 gap-1 max-h-48 overflow-y-auto",children:[j.map(q=>{const ge=d.some(D=>D.channel_id===q.id);return l.jsxs("button",{onClick:()=>!ge&&ze(q),disabled:ge,className:Mt("flex items-center gap-2 px-3 py-2 rounded-lg text-left text-sm transition-colors",ge?"opacity-40 cursor-not-allowed bg-dark-700":"bg-dark-700 hover:bg-dark-600 cursor-pointer"),children:[q.logo?l.jsx("img",{src:q.logo,alt:"",className:"w-6 h-6 object-contain rounded",onError:D=>D.currentTarget.style.display="none"}):l.jsx("div",{className:"w-6 h-6 bg-dark-600 rounded"}),l.jsx("span",{className:"truncate flex-1",children:q.name}),ge&&l.jsx("span",{className:"text-xs text-green-500",children:"✓"})]},q.id)}),j.length===0&&(m||x)&&l.jsx("p",{className:"col-span-2 text-xs text-gray-500 text-center py-4",children:"Sin resultados"})]})]}),l.jsx("div",{className:"flex-1 overflow-y-auto p-4",children:d.length===0?l.jsxs("div",{className:"text-center py-16 text-gray-500",children:[l.jsx("p",{children:"Esta categoría está vacía."}),l.jsx("p",{className:"text-xs mt-1",children:'Usa "Añadir canales" para añadir contenido.'})]}):l.jsx("div",{className:"grid grid-cols-1 gap-1",children:d.map((q,ge)=>l.jsxs("div",{className:"flex items-center gap-3 px-3 py-2 rounded-lg bg-dark-800 hover:bg-dark-700 group transition-colors",children:[l.jsx("span",{className:"text-xs text-gray-600 w-6 text-right",children:ge+1}),q.logo?l.jsx("img",{src:q.logo,alt:"",className:"w-8 h-8 object-contain rounded",onError:D=>D.currentTarget.style.display="none"}):l.jsx("div",{className:"w-8 h-8 bg-dark-600 rounded"}),l.jsx("span",{className:"flex-1 text-sm",children:q.name}),l.jsx("span",{className:Mt("text-xs px-1.5 py-0.5 rounded",ea[q.type]||"bg-gray-700 text-gray-400"),children:ho[q.type]||q.type}),l.jsx("button",{onClick:()=>Ee(q),className:"opacity-0 group-hover:opacity-100 text-red-500 hover:text-red-400 p-1 transition-all",children:l.jsx(Ln,{size:14})})]},q.item_id))})})]}):l.jsx("div",{className:"flex-1 flex items-center justify-center text-gray-500",children:l.jsxs("div",{className:"text-center",children:[l.jsx(Pn,{size:40,className:"mx-auto mb-3 text-gray-700"}),l.jsx("p",{children:"Selecciona una categoría para gestionar sus canales"})]})})})]})}function xo(s){return s>=1e9?(s/1e9).toFixed(2)+" GB":s>=1e6?(s/1e6).toFixed(1)+" MB":s>=1e3?(s/1e3).toFixed(0)+" KB":s+" B"}function ef(s){return s?s<60?`${s}s`:s<3600?`${Math.floor(s/60)}m ${s%60}s`:`${Math.floor(s/3600)}h ${Math.floor(s%3600/60)}m`:"—"}function Wf(s){return s?new Date(s).toLocaleString("es-ES",{dateStyle:"short",timeStyle:"short"}):"—"}const Dg={live:"bg-blue-500/20 text-blue-400",movie:"bg-purple-500/20 text-purple-400",series:"bg-orange-500/20 text-orange-400"},Fg={live:"Directo",movie:"Película",series:"Serie"};function Xn({icon:s,label:a,value:i,color:c}){return l.jsxs("div",{className:"bg-dark-800 rounded-xl p-4 flex items-center gap-3",children:[l.jsx(s,{size:20,className:c}),l.jsxs("div",{children:[l.jsx("p",{className:"text-xs text-gray-500",children:a}),l.jsx("p",{className:"text-lg font-bold",children:i})]})]})}function Ug(){const[s,a]=v.useState([]),[i,c]=v.useState(null),[d,f]=v.useState(0),[m,h]=v.useState(1),[x,y]=v.useState(!1),[j,_]=v.useState(""),[O,B]=v.useState(""),[L,P]=v.useState(""),[N,A]=v.useState(""),[M,K]=v.useState(""),Q=50,me=v.useCallback(async()=>{try{const{data:Y}=await X.get("/logs/stats");c(Y)}catch{}},[]),fe=v.useCallback(async(Y=1)=>{y(!0);try{const je={page:Y,limit:Q};j&&(je.username=j),O&&(je.channel=O),L&&(je.content_type=L),N&&(je.date_from=N),M&&(je.date_to=M);const{data:Te}=await X.get("/logs",{params:je});a(Te.items),f(Te.total),h(Y)}finally{y(!1)}},[j,O,L,N,M]);v.useEffect(()=>{me(),fe(1)},[]);const z=()=>{me(),fe(1)},ae=async()=>{confirm("¿Eliminar todos los registros de conexión?")&&(await X.delete("/logs"),a([]),f(0),me())},de=Math.ceil(d/Q);return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex justify-end gap-2",children:[l.jsxs("button",{onClick:()=>{me(),fe(m)},className:"flex items-center gap-2 px-3 py-1.5 bg-dark-700 hover:bg-dark-600 rounded-lg text-sm transition-colors",children:[l.jsx(Ge,{size:14})," Actualizar"]}),l.jsxs("button",{onClick:ae,className:"flex items-center gap-2 px-3 py-1.5 bg-red-500/20 text-red-400 hover:bg-red-500/30 rounded-lg text-sm transition-colors",children:[l.jsx(rn,{size:14})," Limpiar todo"]})]}),i&&l.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-4 gap-4",children:[l.jsx(Xn,{icon:So,label:"Total sesiones",value:i.total_sessions.toLocaleString(),color:"text-primary-400"}),l.jsx(Xn,{icon:ch,label:"Datos totales",value:xo(i.total_bytes),color:"text-green-400"}),l.jsx(Xn,{icon:So,label:"Duración media",value:ef(i.avg_duration_seconds),color:"text-yellow-400"}),l.jsx(Xn,{icon:aa,label:"Usuarios únicos",value:i.unique_users.toString(),color:"text-blue-400"})]}),i&&l.jsxs("div",{className:"grid grid-cols-2 gap-4",children:[l.jsxs("div",{className:"bg-dark-800 rounded-xl p-4",children:[l.jsxs("h3",{className:"text-sm font-semibold mb-3 text-gray-300 flex items-center gap-2",children:[l.jsx(aa,{size:14})," Top usuarios"]}),l.jsxs("div",{className:"space-y-2",children:[i.top_users.map((Y,je)=>l.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[l.jsx("span",{className:"text-gray-600 w-4",children:je+1}),l.jsx("span",{className:"flex-1 text-gray-200 font-medium",children:Y.username}),l.jsxs("span",{className:"text-gray-400",children:[Y.sessions," sesiones"]}),l.jsx("span",{className:"text-green-400 text-xs",children:xo(Y.bytes)})]},Y.username)),i.top_users.length===0&&l.jsx("p",{className:"text-xs text-gray-600",children:"Sin datos"})]})]}),l.jsxs("div",{className:"bg-dark-800 rounded-xl p-4",children:[l.jsxs("h3",{className:"text-sm font-semibold mb-3 text-gray-300 flex items-center gap-2",children:[l.jsx(Tr,{size:14})," Top canales/contenido"]}),l.jsxs("div",{className:"space-y-2",children:[i.top_channels.map((Y,je)=>l.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[l.jsx("span",{className:"text-gray-600 w-4",children:je+1}),l.jsx("span",{className:"flex-1 text-gray-200 truncate",children:Y.channel_name}),l.jsx("span",{className:"text-gray-400",children:Y.sessions})]},Y.channel_name)),i.top_channels.length===0&&l.jsx("p",{className:"text-xs text-gray-600",children:"Sin datos"})]})]})]}),l.jsx("div",{className:"bg-dark-800 rounded-xl p-4",children:l.jsxs("div",{className:"flex flex-wrap gap-2 items-end",children:[l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:13,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:j,onChange:Y=>_(Y.target.value),onKeyDown:Y=>Y.key==="Enter"&&z(),placeholder:"Usuario",className:"bg-dark-700 border border-dark-600 rounded-lg pl-8 pr-3 py-1.5 text-sm w-36 focus:outline-none focus:border-primary-500"})]}),l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:13,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:O,onChange:Y=>B(Y.target.value),onKeyDown:Y=>Y.key==="Enter"&&z(),placeholder:"Canal / película",className:"bg-dark-700 border border-dark-600 rounded-lg pl-8 pr-3 py-1.5 text-sm w-48 focus:outline-none focus:border-primary-500"})]}),l.jsxs("select",{value:L,onChange:Y=>P(Y.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none",children:[l.jsx("option",{value:"",children:"Todos los tipos"}),l.jsx("option",{value:"live",children:"Directo"}),l.jsx("option",{value:"movie",children:"Película"}),l.jsx("option",{value:"series",children:"Serie"})]}),l.jsx("input",{type:"date",value:N,onChange:Y=>A(Y.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none"}),l.jsx("span",{className:"text-gray-500 text-sm",children:"→"}),l.jsx("input",{type:"date",value:M,onChange:Y=>K(Y.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none"}),l.jsxs("button",{onClick:z,className:"flex items-center gap-2 px-4 py-1.5 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm transition-colors",children:[l.jsx(Kt,{size:13})," Buscar"]})]})}),l.jsxs("div",{className:"bg-dark-800 rounded-xl overflow-hidden",children:[l.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-dark-700",children:[l.jsxs("span",{className:"text-sm text-gray-400",children:[d.toLocaleString()," registros"]}),de>1&&l.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[l.jsx("button",{onClick:()=>fe(m-1),disabled:m===1,className:"px-2 py-1 bg-dark-700 rounded disabled:opacity-40",children:"←"}),l.jsxs("span",{className:"text-gray-400",children:[m," / ",de]}),l.jsx("button",{onClick:()=>fe(m+1),disabled:m===de,className:"px-2 py-1 bg-dark-700 rounded disabled:opacity-40",children:"→"})]})]}),l.jsx("div",{className:"overflow-x-auto",children:l.jsxs("table",{className:"w-full text-sm",children:[l.jsx("thead",{children:l.jsxs("tr",{className:"text-xs text-gray-500 border-b border-dark-700",children:[l.jsx("th",{className:"text-left px-4 py-2",children:"Usuario"}),l.jsx("th",{className:"text-left px-4 py-2",children:"IP"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Canal / Contenido"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Tipo"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Inicio"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Duración"}),l.jsx("th",{className:"text-right px-4 py-2",children:"Datos"})]})}),l.jsxs("tbody",{children:[x&&l.jsx("tr",{children:l.jsx("td",{colSpan:7,className:"text-center py-8 text-gray-500",children:"Cargando..."})}),!x&&s.length===0&&l.jsx("tr",{children:l.jsx("td",{colSpan:7,className:"text-center py-8 text-gray-500",children:"No hay registros"})}),s.map(Y=>l.jsxs("tr",{className:"border-b border-dark-700/50 hover:bg-dark-700/30 transition-colors",children:[l.jsx("td",{className:"px-4 py-2 font-medium text-gray-200",children:Y.username}),l.jsx("td",{className:"px-4 py-2 text-gray-400 font-mono text-xs",children:Y.client_ip||"—"}),l.jsx("td",{className:"px-4 py-2 text-gray-300 max-w-xs truncate",children:Y.channel_name||Y.stream_id||"—"}),l.jsx("td",{className:"px-4 py-2",children:Y.content_type?l.jsx("span",{className:Mt("text-xs px-2 py-0.5 rounded-full",Dg[Y.content_type]||"bg-gray-700 text-gray-400"),children:Fg[Y.content_type]||Y.content_type}):"—"}),l.jsx("td",{className:"px-4 py-2 text-gray-400 text-xs",children:Wf(Y.started_at)}),l.jsx("td",{className:"px-4 py-2 text-gray-400",children:ef(Y.duration_seconds)}),l.jsx("td",{className:"px-4 py-2 text-right text-green-400 text-xs",children:xo(Y.bytes_transferred)})]},Y.id))]})]})})]})]})}function Mg(){const[s,a]=v.useState([]),[i,c]=v.useState(0),[d,f]=v.useState(1),[m,h]=v.useState(!1),[x,y]=v.useState(""),[j,_]=v.useState(""),[O,B]=v.useState(""),[L,P]=v.useState(""),N=50,A=v.useCallback(async(z=1)=>{h(!0);try{const ae={page:z,limit:N};x&&(ae.channel=x),j&&(ae.event_type=j),O&&(ae.date_from=O),L&&(ae.date_to=L);const{data:de}=await X.get("/logs/events",{params:ae});a(de.items),c(de.total),f(z)}finally{h(!1)}},[x,j,O,L]);v.useEffect(()=>{A(1)},[]);const M=()=>A(1),K=async()=>{confirm("¿Eliminar todos los registros de fallos?")&&(await X.delete("/logs/events"),a([]),c(0))},Q=Math.ceil(i/N),me=s.filter(z=>z.event_type==="caida").length,fe=s.filter(z=>z.event_type==="recuperado").length;return l.jsxs("div",{className:"space-y-6",children:[l.jsxs("div",{className:"flex justify-end gap-2",children:[l.jsxs("button",{onClick:()=>A(d),className:"flex items-center gap-2 px-3 py-1.5 bg-dark-700 hover:bg-dark-600 rounded-lg text-sm transition-colors",children:[l.jsx(Ge,{size:14})," Actualizar"]}),l.jsxs("button",{onClick:K,className:"flex items-center gap-2 px-3 py-1.5 bg-red-500/20 text-red-400 hover:bg-red-500/30 rounded-lg text-sm transition-colors",children:[l.jsx(rn,{size:14})," Limpiar todo"]})]}),l.jsxs("div",{className:"grid grid-cols-2 lg:grid-cols-3 gap-4",children:[l.jsx(Xn,{icon:Zn,label:"Total fallos registrados",value:i.toLocaleString(),color:"text-orange-400"}),l.jsx(Xn,{icon:Zn,label:"Caídas (en vista actual)",value:me.toString(),color:"text-red-400"}),l.jsx(Xn,{icon:Ad,label:"Recuperaciones (en vista actual)",value:fe.toString(),color:"text-emerald-400"})]}),l.jsx("div",{className:"bg-dark-800 rounded-xl p-4",children:l.jsxs("div",{className:"flex flex-wrap gap-2 items-end",children:[l.jsxs("div",{className:"relative",children:[l.jsx(Kt,{size:13,className:"absolute left-2.5 top-1/2 -translate-y-1/2 text-gray-500"}),l.jsx("input",{value:x,onChange:z=>y(z.target.value),onKeyDown:z=>z.key==="Enter"&&M(),placeholder:"Canal / proveedor",className:"bg-dark-700 border border-dark-600 rounded-lg pl-8 pr-3 py-1.5 text-sm w-48 focus:outline-none focus:border-primary-500"})]}),l.jsxs("select",{value:j,onChange:z=>_(z.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none",children:[l.jsx("option",{value:"",children:"Todos los eventos"}),l.jsx("option",{value:"caida",children:"Caídas"}),l.jsx("option",{value:"recuperado",children:"Recuperaciones"})]}),l.jsx("input",{type:"date",value:O,onChange:z=>B(z.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none"}),l.jsx("span",{className:"text-gray-500 text-sm",children:"→"}),l.jsx("input",{type:"date",value:L,onChange:z=>P(z.target.value),className:"bg-dark-700 border border-dark-600 rounded-lg px-3 py-1.5 text-sm focus:outline-none"}),l.jsxs("button",{onClick:M,className:"flex items-center gap-2 px-4 py-1.5 bg-primary-500 hover:bg-primary-600 rounded-lg text-sm transition-colors",children:[l.jsx(Kt,{size:13})," Buscar"]})]})}),l.jsxs("div",{className:"bg-dark-800 rounded-xl overflow-hidden",children:[l.jsxs("div",{className:"flex items-center justify-between px-4 py-3 border-b border-dark-700",children:[l.jsxs("span",{className:"text-sm text-gray-400",children:[i.toLocaleString()," eventos"]}),Q>1&&l.jsxs("div",{className:"flex items-center gap-2 text-sm",children:[l.jsx("button",{onClick:()=>A(d-1),disabled:d===1,className:"px-2 py-1 bg-dark-700 rounded disabled:opacity-40",children:"←"}),l.jsxs("span",{className:"text-gray-400",children:[d," / ",Q]}),l.jsx("button",{onClick:()=>A(d+1),disabled:d===Q,className:"px-2 py-1 bg-dark-700 rounded disabled:opacity-40",children:"→"})]})]}),l.jsx("div",{className:"overflow-x-auto",children:l.jsxs("table",{className:"w-full text-sm",children:[l.jsx("thead",{children:l.jsxs("tr",{className:"text-xs text-gray-500 border-b border-dark-700",children:[l.jsx("th",{className:"text-left px-4 py-2",children:"Fecha"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Tipo"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Canal"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Proveedor"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Dominio"}),l.jsx("th",{className:"text-left px-4 py-2",children:"Detalle"}),l.jsx("th",{className:"text-right px-4 py-2",children:"Intento"})]})}),l.jsxs("tbody",{children:[m&&l.jsx("tr",{children:l.jsx("td",{colSpan:7,className:"text-center py-8 text-gray-500",children:"Cargando..."})}),!m&&s.length===0&&l.jsx("tr",{children:l.jsx("td",{colSpan:7,className:"text-center py-8 text-gray-500",children:"No hay eventos registrados — los fallos aparecerán aquí automáticamente"})}),s.map(z=>l.jsxs("tr",{className:"border-b border-dark-700/50 hover:bg-dark-700/30 transition-colors",children:[l.jsx("td",{className:"px-4 py-2 text-gray-400 text-xs whitespace-nowrap",children:Wf(z.created_at)}),l.jsx("td",{className:"px-4 py-2",children:z.event_type==="caida"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-red-500/20 text-red-400",children:[l.jsx(Zn,{size:10})," Caída"]}):z.event_type==="recuperado"?l.jsxs("span",{className:"inline-flex items-center gap-1 text-xs px-2 py-0.5 rounded-full bg-emerald-500/20 text-emerald-400",children:[l.jsx(Ad,{size:10})," Recuperado"]}):l.jsx("span",{className:"text-xs text-gray-400",children:z.event_type})}),l.jsx("td",{className:"px-4 py-2 text-gray-200 max-w-[180px] truncate",title:z.channel_name??"",children:z.channel_name||`#${z.channel_id}`||"—"}),l.jsx("td",{className:"px-4 py-2 text-gray-400 text-xs",children:z.provider_name||"—"}),l.jsx("td",{className:"px-4 py-2 text-gray-400 font-mono text-xs",children:z.domain||"—"}),l.jsx("td",{className:"px-4 py-2 text-gray-500 text-xs max-w-[240px] truncate",title:z.error_message??"",children:z.error_message||"—"}),l.jsx("td",{className:"px-4 py-2 text-right text-gray-500 text-xs tabular-nums",children:z.attempt_number??"—"})]},z.id))]})]})})]})]})}function Ig(){const[s,a]=v.useState("connections");return l.jsxs("div",{className:"p-6 space-y-6",children:[l.jsx("div",{className:"flex items-center justify-between",children:l.jsx("h1",{className:"text-xl font-bold",children:"Registro"})}),l.jsxs("div",{className:"flex gap-1 border-b border-dark-700 pb-0",children:[l.jsx("button",{onClick:()=>a("connections"),className:Mt("px-4 py-2 text-sm font-medium rounded-t-lg transition-colors border-b-2 -mb-px",s==="connections"?"border-primary-500 text-primary-400 bg-dark-800":"border-transparent text-gray-500 hover:text-gray-300"),children:"Conexiones de usuarios"}),l.jsxs("button",{onClick:()=>a("events"),className:Mt("px-4 py-2 text-sm font-medium rounded-t-lg transition-colors border-b-2 -mb-px flex items-center gap-1.5",s==="events"?"border-red-500 text-red-400 bg-dark-800":"border-transparent text-gray-500 hover:text-gray-300"),children:[l.jsx(Zn,{size:13})," Fallos de stream"]})]}),s==="connections"&&l.jsx(Ug,{}),s==="events"&&l.jsx(Mg,{})]})}function $g(){const[s,a]=v.useState(!1),[i,c]=v.useState(""),[d,f]=v.useState(!1),[m,h]=v.useState(!1),x=v.useRef(null),y=async()=>{try{const L=localStorage.getItem("token");(await fetch("/api/admin/settings/blocked-image",{headers:{Authorization:`Bearer ${L}`}})).ok?(a(!0),c("/panel/blocked_image.jpg?t="+Date.now())):(a(!1),c(""))}catch{a(!1)}};v.useEffect(()=>{y()},[]);const j=async L=>{var P,N;if(!L.type.startsWith("image/")){alert("Solo se permiten imágenes (JPEG, PNG, WebP, GIF)");return}f(!0);try{const A=new FormData;A.append("file",L),await X.post("/settings/blocked-image",A,{headers:{"Content-Type":"multipart/form-data"}}),await y()}catch(A){alert("Error al subir la imagen: "+(((N=(P=A.response)==null?void 0:P.data)==null?void 0:N.detail)||A.message))}finally{f(!1)}},_=L=>{var N;const P=(N=L.target.files)==null?void 0:N[0];P&&j(P),L.target.value=""},O=L=>{L.preventDefault(),h(!1);const P=L.dataTransfer.files[0];P&&j(P)},B=async()=>{confirm("¿Eliminar la imagen de bloqueo?")&&(await X.delete("/settings/blocked-image"),a(!1),c(""))};return l.jsxs("div",{className:"p-6 max-w-2xl space-y-6",children:[l.jsx("h1",{className:"text-xl font-bold",children:"Ajustes"}),l.jsxs("div",{className:"bg-dark-800 rounded-xl p-6 space-y-4",children:[l.jsxs("div",{children:[l.jsxs("h2",{className:"font-semibold text-base flex items-center gap-2",children:[l.jsx(dh,{size:18,className:"text-primary-400"}),"Imagen de conexión bloqueada"]}),l.jsx("p",{className:"text-sm text-gray-400 mt-1",children:"Esta imagen se mostrará como canal de vídeo cuando un usuario intente reproducir en un segundo dispositivo habiendo alcanzado su límite de conexiones simultáneas."})]}),l.jsxs("div",{className:"flex items-start gap-2 text-xs text-blue-400 bg-blue-500/10 rounded-lg px-3 py-2",children:[l.jsx(fh,{size:13,className:"mt-0.5 shrink-0"}),l.jsx("span",{children:"El zapping normal (cambiar de canal en el mismo dispositivo) sigue funcionando sin interrupciones. La imagen solo aparece cuando se conecta un segundo dispositivo diferente con la misma cuenta."})]}),l.jsxs("div",{onDragOver:L=>{L.preventDefault(),h(!0)},onDragLeave:()=>h(!1),onDrop:O,onClick:()=>{var L;return!d&&((L=x.current)==null?void 0:L.click())},className:` + relative border-2 border-dashed rounded-xl cursor-pointer transition-colors + ${m?"border-primary-400 bg-primary-500/10":"border-dark-600 hover:border-dark-500"} + `,children:[l.jsx("input",{ref:x,type:"file",accept:"image/*",className:"hidden",onChange:_}),s&&i?l.jsxs("div",{className:"relative",children:[l.jsx("img",{src:i,alt:"Blocked image",className:"w-full rounded-xl object-contain max-h-72"}),l.jsx("div",{className:"absolute inset-0 bg-black/40 opacity-0 hover:opacity-100 transition-opacity rounded-xl flex items-center justify-center",children:l.jsx("span",{className:"text-white text-sm font-medium",children:"Haz clic para cambiar"})})]}):l.jsxs("div",{className:"py-12 flex flex-col items-center gap-3 text-gray-500",children:[l.jsx(vh,{size:32,className:m?"text-primary-400":""}),l.jsxs("div",{className:"text-center",children:[l.jsx("p",{className:"font-medium text-sm",children:"Arrastra una imagen o haz clic para subir"}),l.jsx("p",{className:"text-xs mt-1",children:"JPEG, PNG, WebP o GIF · máx. 10 MB"})]})]}),d&&l.jsx("div",{className:"absolute inset-0 bg-dark-900/80 rounded-xl flex items-center justify-center",children:l.jsx("div",{className:"text-sm text-primary-400",children:"Subiendo..."})})]}),s&&l.jsx("div",{className:"flex justify-end",children:l.jsxs("button",{onClick:B,className:"flex items-center gap-2 px-3 py-1.5 bg-red-500/20 text-red-400 hover:bg-red-500/30 rounded-lg text-sm transition-colors",children:[l.jsx(rn,{size:14})," Eliminar imagen"]})})]})]})}const tf={name:"",url:"http://10.10.10.15:8096",api_key:"c339ccd3b7234c9a874bcfb70e92364a",movies_category_name:"Películas KiraTV",series_category_name:"Series KiraTV",movies_library_id:"",series_library_id:""};function Bg(){const[s,a]=v.useState([]),[i,c]=v.useState(!0),[d,f]=v.useState(!1),[m,h]=v.useState(null),[x,y]=v.useState({...tf}),[j,_]=v.useState(!1),[O,B]=v.useState(null),[L,P]=v.useState(!1),[N,A]=v.useState([]),[M,K]=v.useState(!1),[Q,me]=v.useState({}),[fe,z]=v.useState(null);v.useEffect(()=>{ae()},[]);async function ae(){c(!0);try{const{data:D}=await X.get("/jellyfin");a(D)}finally{c(!1)}}function de(){h(null),y({...tf}),B(null),A([]),f(!0)}function Y(D){h(D.id),y({name:D.name,url:D.url,api_key:D.api_key,movies_category_name:D.movies_category_name,series_category_name:D.series_category_name,movies_library_id:D.movies_library_id??"",series_library_id:D.series_library_id??""}),B(null),A([]),f(!0)}async function je(){if(!(!x.url||!x.api_key)){P(!0),B(null);try{if(m){const{data:D}=await X.post(`/jellyfin/${m}/test`);B(D)}else{const{data:D}=await X.post("/jellyfin",{name:"__test__",url:x.url,api_key:x.api_key,movies_category_name:x.movies_category_name,series_category_name:x.series_category_name}),{data:U}=await X.post(`/jellyfin/${D.id}/test`);await X.delete(`/jellyfin/${D.id}`),B(U)}}catch{B({ok:!1,error:"Error de red"})}finally{P(!1)}}}async function Te(){if(!m){await ze();return}K(!0);try{const{data:D}=await X.get(`/jellyfin/${m}/libraries`);A(D)}catch{A([])}finally{K(!1)}}async function ze(){_(!0);try{const D={...x,movies_library_id:x.movies_library_id||null,series_library_id:x.series_library_id||null};if(m)await X.put(`/jellyfin/${m}`,D);else{const{data:U}=await X.post("/jellyfin",D);h(U.id)}await ae()}finally{_(!1)}}async function Ee(D){confirm("¿Eliminar esta configuración de Jellyfin? Se borrarán todos los canales sincronizados.")&&(await X.delete(`/jellyfin/${D}`),a(U=>U.filter(ee=>ee.id!==D)),m===D&&f(!1))}async function q(D){me(U=>({...U,[D]:{status:"running",message:"Iniciando…",synced:0}})),await X.post(`/jellyfin/${D}/sync`),ge(D)}function ge(D){const U=setInterval(async()=>{try{const{data:ee}=await X.get(`/jellyfin/${D}/sync-status`);me(G=>({...G,[D]:ee})),ee.status!=="running"&&(clearInterval(U),ee.status==="done"&&ae())}catch{clearInterval(U)}},1500)}return N.filter(D=>D.type==="movies"||D.type===""),N.filter(D=>D.type==="tvshows"||D.type===""),l.jsxs("div",{className:"p-6 max-w-4xl mx-auto",children:[l.jsxs("div",{className:"flex items-center justify-between mb-6",children:[l.jsxs("div",{children:[l.jsx("h1",{className:"text-2xl font-bold",children:"Biblioteca Jellyfin"}),l.jsx("p",{className:"text-gray-400 text-sm mt-1",children:"Integra tu catálogo local de Jellyfin como VOD y Series en KiraStream"})]}),l.jsxs("button",{onClick:de,className:"flex items-center gap-2 bg-primary-600 hover:bg-primary-500 text-white px-4 py-2 rounded-lg text-sm font-medium transition-colors",children:[l.jsx(tr,{size:16})," Nueva conexión"]})]}),i?l.jsx("div",{className:"flex justify-center py-12",children:l.jsx(Xl,{size:24,className:"animate-spin text-gray-400"})}):s.length===0?l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl p-12 text-center text-gray-500",children:[l.jsx(Gn,{size:36,className:"mx-auto mb-3 opacity-30"}),l.jsx("p",{className:"text-sm",children:"No hay conexiones Jellyfin configuradas"}),l.jsx("button",{onClick:de,className:"mt-4 text-primary-400 hover:text-primary-300 text-sm",children:"+ Añadir primera conexión"})]}):l.jsx("div",{className:"space-y-4",children:s.map(D=>{const U=Q[D.id];return l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl overflow-hidden",children:[l.jsxs("div",{className:"flex items-center gap-4 p-4",children:[l.jsx("div",{className:"w-10 h-10 rounded-lg bg-purple-900/30 flex items-center justify-center shrink-0",children:l.jsx(Gn,{size:20,className:"text-purple-400"})}),l.jsxs("div",{className:"flex-1 min-w-0",children:[l.jsxs("div",{className:"flex items-center gap-2",children:[l.jsx("span",{className:"font-medium",children:D.name}),l.jsx("span",{className:`text-xs px-1.5 py-0.5 rounded ${D.is_active?"bg-green-900/30 text-green-400":"bg-gray-700 text-gray-400"}`,children:D.is_active?"activo":"inactivo"})]}),l.jsx("div",{className:"text-xs text-gray-500 mt-0.5 truncate",children:D.url}),l.jsxs("div",{className:"text-xs text-gray-600 mt-0.5",children:[D.item_count," elementos",D.last_sync_at&&` · Última sync: ${new Date(D.last_sync_at).toLocaleString("es-ES")}`]})]}),l.jsxs("div",{className:"flex items-center gap-2 shrink-0",children:[(U==null?void 0:U.status)==="running"?l.jsxs("span",{className:"flex items-center gap-1 text-xs text-yellow-400",children:[l.jsx(Ge,{size:12,className:"animate-spin"})," ",U.message]}):l.jsxs("button",{onClick:()=>q(D.id),className:"flex items-center gap-1.5 text-xs bg-dark-700 hover:bg-primary-600 text-gray-300 hover:text-white px-3 py-1.5 rounded-lg transition-colors",children:[l.jsx(Ge,{size:12})," Sincronizar"]}),l.jsx("button",{onClick:()=>Y(D),className:"text-gray-500 hover:text-primary-400 p-1.5 rounded transition-colors",title:"Editar",children:l.jsx(hh,{size:14})}),l.jsx("button",{onClick:()=>Ee(D.id),className:"text-gray-500 hover:text-red-400 p-1.5 rounded transition-colors",title:"Eliminar",children:l.jsx(rn,{size:14})}),l.jsx("button",{onClick:()=>z(fe===D.id?null:D.id),className:"text-gray-500 hover:text-gray-300 p-1.5 rounded transition-colors",children:fe===D.id?l.jsx(uh,{size:14}):l.jsx(jo,{size:14})})]})]}),(U==null?void 0:U.status)==="done"&&l.jsxs("div",{className:"px-4 pb-3 text-xs text-green-400 flex items-center gap-1",children:[l.jsx(oo,{size:12})," ",U.message," · ",U.synced," elementos importados"]}),(U==null?void 0:U.status)==="error"&&l.jsxs("div",{className:"px-4 pb-3 text-xs text-red-400 flex items-center gap-1",children:[l.jsx(Ln,{size:12})," Error: ",U.message]}),fe===D.id&&l.jsxs("div",{className:"px-4 pb-4 border-t border-dark-700 pt-3 grid grid-cols-2 gap-4 text-xs text-gray-400",children:[l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-1 mb-1 text-purple-400 font-medium",children:[l.jsx(Gn,{size:12})," Películas"]}),l.jsxs("div",{children:["Categoría: ",l.jsx("span",{className:"text-gray-300",children:D.movies_category_name})]}),l.jsxs("div",{children:["Biblioteca: ",l.jsx("span",{className:"text-gray-300",children:D.movies_library_id||"—"})]})]}),l.jsxs("div",{children:[l.jsxs("div",{className:"flex items-center gap-1 mb-1 text-blue-400 font-medium",children:[l.jsx(Tr,{size:12})," Series"]}),l.jsxs("div",{children:["Categoría: ",l.jsx("span",{className:"text-gray-300",children:D.series_category_name})]}),l.jsxs("div",{children:["Biblioteca: ",l.jsx("span",{className:"text-gray-300",children:D.series_library_id||"—"})]})]})]})]},D.id)})}),d&&l.jsx("div",{className:"fixed inset-0 bg-black/60 flex items-center justify-center z-50 p-4",children:l.jsxs("div",{className:"bg-dark-800 border border-dark-700 rounded-xl w-full max-w-lg max-h-[90vh] overflow-y-auto",children:[l.jsxs("div",{className:"flex items-center justify-between p-4 border-b border-dark-700",children:[l.jsx("h2",{className:"font-semibold",children:m?"Editar conexión":"Nueva conexión Jellyfin"}),l.jsx("button",{onClick:()=>f(!1),className:"text-gray-500 hover:text-white",children:l.jsx(Ln,{size:16})})]}),l.jsxs("div",{className:"p-4 space-y-4",children:[l.jsxs("div",{children:[l.jsx("label",{className:"text-xs text-gray-400 mb-1 block",children:"Nombre"}),l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",value:x.name,onChange:D=>y(U=>({...U,name:D.target.value})),placeholder:"Mi Jellyfin"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"text-xs text-gray-400 mb-1 block",children:"URL del servidor"}),l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm font-mono",value:x.url,onChange:D=>y(U=>({...U,url:D.target.value})),placeholder:"http://192.168.1.x:8096"})]}),l.jsxs("div",{children:[l.jsx("label",{className:"text-xs text-gray-400 mb-1 block",children:"API Key"}),l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm font-mono",value:x.api_key,onChange:D=>y(U=>({...U,api_key:D.target.value})),placeholder:"Tu API key de Jellyfin"})]}),l.jsxs("div",{className:"flex items-center gap-3",children:[l.jsxs("button",{onClick:je,disabled:L||!x.url||!x.api_key,className:"flex items-center gap-1.5 bg-dark-700 hover:bg-dark-600 text-sm px-3 py-2 rounded-lg transition-colors disabled:opacity-50",children:[L?l.jsx(Xl,{size:14,className:"animate-spin"}):l.jsx(oo,{size:14}),"Probar conexión"]}),O&&l.jsx("span",{className:`text-xs flex items-center gap-1 ${O.ok?"text-green-400":"text-red-400"}`,children:O.ok?l.jsxs(l.Fragment,{children:[l.jsx(oo,{size:12})," ",O.server_name]}):l.jsxs(l.Fragment,{children:[l.jsx(Ln,{size:12})," ",O.error]})})]}),l.jsx("hr",{className:"border-dark-600"}),l.jsxs("div",{className:"flex items-center justify-between",children:[l.jsx("span",{className:"text-xs text-gray-400 font-medium uppercase tracking-wider",children:"Bibliotecas"}),l.jsxs("button",{onClick:Te,disabled:M,className:"flex items-center gap-1 text-xs text-primary-400 hover:text-primary-300 transition-colors disabled:opacity-50",children:[M?l.jsx(Xl,{size:11,className:"animate-spin"}):l.jsx(Ge,{size:11}),m?"Cargar bibliotecas":"Guardar primero para cargar"]})]}),l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{children:[l.jsxs("label",{className:"text-xs text-gray-400 mb-1 block flex items-center gap-1",children:[l.jsx(Gn,{size:11})," Biblioteca de Películas"]}),N.length>0?l.jsxs("select",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",value:x.movies_library_id,onChange:D=>y(U=>({...U,movies_library_id:D.target.value})),children:[l.jsx("option",{value:"",children:"— ninguna —"}),N.map(D=>l.jsxs("option",{value:D.id,children:[D.name," (",D.type||"sin tipo",")"]},D.id))]}):l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm font-mono text-xs",value:x.movies_library_id,onChange:D=>y(U=>({...U,movies_library_id:D.target.value})),placeholder:"ID de biblioteca"})]}),l.jsxs("div",{children:[l.jsxs("label",{className:"text-xs text-gray-400 mb-1 block flex items-center gap-1",children:[l.jsx(Tr,{size:11})," Biblioteca de Series"]}),N.length>0?l.jsxs("select",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",value:x.series_library_id,onChange:D=>y(U=>({...U,series_library_id:D.target.value})),children:[l.jsx("option",{value:"",children:"— ninguna —"}),N.map(D=>l.jsxs("option",{value:D.id,children:[D.name," (",D.type||"sin tipo",")"]},D.id))]}):l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm font-mono text-xs",value:x.series_library_id,onChange:D=>y(U=>({...U,series_library_id:D.target.value})),placeholder:"ID de biblioteca"})]})]}),l.jsxs("div",{className:"grid grid-cols-2 gap-3",children:[l.jsxs("div",{children:[l.jsx("label",{className:"text-xs text-gray-400 mb-1 block",children:"Nombre categoría Películas"}),l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",value:x.movies_category_name,onChange:D=>y(U=>({...U,movies_category_name:D.target.value}))})]}),l.jsxs("div",{children:[l.jsx("label",{className:"text-xs text-gray-400 mb-1 block",children:"Nombre categoría Series"}),l.jsx("input",{className:"w-full bg-dark-700 border border-dark-600 rounded-lg px-3 py-2 text-sm",value:x.series_category_name,onChange:D=>y(U=>({...U,series_category_name:D.target.value}))})]})]})]}),l.jsxs("div",{className:"flex justify-end gap-3 p-4 border-t border-dark-700",children:[l.jsx("button",{onClick:()=>f(!1),className:"px-4 py-2 text-sm text-gray-400 hover:text-white",children:"Cancelar"}),l.jsxs("button",{onClick:async()=>{await ze(),f(!1)},disabled:j||!x.name||!x.url||!x.api_key,className:"flex items-center gap-2 bg-primary-600 hover:bg-primary-500 text-white px-4 py-2 rounded-lg text-sm font-medium transition-colors disabled:opacity-50",children:[j&&l.jsx(Xl,{size:14,className:"animate-spin"}),m?"Guardar cambios":"Crear"]})]})]})})]})}function Vg({children:s}){return localStorage.getItem("token")?l.jsx(l.Fragment,{children:s}):l.jsx(vo,{to:"/login",replace:!0})}function Hg(){return l.jsx(Y0,{basename:"/panel",children:l.jsxs(V0,{children:[l.jsx(yt,{path:"/login",element:l.jsx(cg,{})}),l.jsxs(yt,{path:"/",element:l.jsx(Vg,{children:l.jsx(mg,{})}),children:[l.jsx(yt,{index:!0,element:l.jsx(vo,{to:"/dashboard",replace:!0})}),l.jsx(yt,{path:"dashboard",element:l.jsx(bg,{})}),l.jsx(yt,{path:"providers",element:l.jsx(Eg,{})}),l.jsx(yt,{path:"users",element:l.jsx(Rg,{})}),l.jsx(yt,{path:"catalogs",element:l.jsx(Og,{})}),l.jsx(yt,{path:"custom-categories",element:l.jsx(Ag,{})}),l.jsx(yt,{path:"epg",element:l.jsx(zg,{})}),l.jsx(yt,{path:"logs",element:l.jsx(Ig,{})}),l.jsx(yt,{path:"settings",element:l.jsx($g,{})}),l.jsx(yt,{path:"jellyfin",element:l.jsx(Bg,{})})]}),l.jsx(yt,{path:"*",element:l.jsx(vo,{to:"/dashboard",replace:!0})})]})})}Gm.createRoot(document.getElementById("root")).render(l.jsx(rf.StrictMode,{children:l.jsx(Hg,{})})); diff --git a/backend/static/blocked_image.jpg b/backend/static/blocked_image.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6d2077ba794ef9ba6a0923c3eb471340bfb2cafc GIT binary patch literal 2459546 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
CtA_q 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ðVX-&rq7XH7`)lGi2%%b+2|k2?*cN=j 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

    IODjZWsA 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 ro89KcAkm8}`kf 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