# DKI Download Ứng dụng web quản lý quyền TMS và tải raw files từ Synology NAS. ## Tech Stack - **Frontend**: React 19 + TypeScript + TailwindCSS + Vite - **Backend Python**: FastAPI + Python 3.12 (xử lý download) - **Backend TypeScript**: Express + Node.js (xử lý TMS permission) - **Database**: MongoDB (metadata) + Supabase PostgreSQL (queue, history, sessions) - **Storage**: Synology NAS (FileStation API + Sharing Link với Selenium) - **Download**: Aria2 (download accelerator) ## Features ### 🔐 Cấp quyền TMS - Cấp quyền hàng loạt (usernames × GE IDs) - Sử dụng TMS REST API trực tiếp - Queue management với drag-and-drop ưu tiên - Real-time status tracking qua Supabase Realtime ### 📥 Tải Raw Files - **API Mode**: Tải trực tiếp qua NAS FileStation API - **Sharing Link Mode**: Tải qua Synology sharing link với Selenium - Browse NAS directories với file browser - Concurrent download queue (max 10 parallel) - Smart file type detection và icons ### ✅ Check Upload - Kiểm tra trạng thái upload của chapters - Lọc theo status: pending, found, not found, error ### 🔧 Custom Paths - Lưu và quản lý custom folder paths cho sharing link - Quick jump đến folder thường dùng ## Quick Start ### Prerequisites - Node.js 18+ và npm - Python 3.12+ - MongoDB access - Supabase project ### Installation ```powershell # Clone và cài đặt dependencies git clone cd dkiDownload npm install # Setup Python backend python -m venv .venv .\.venv\Scripts\Activate.ps1 pip install -r backend/requirements.txt ``` ### Development ```powershell # Chạy cả 3 services (frontend + 2 backends) npm run dev # Hoặc chạy riêng: npm run dev:frontend # Frontend (port 5173) npm run dev:backend-python # Python backend (port 8000) npm run dev:backend-typescript # TypeScript backend (port 3002) ``` **URLs:** - Frontend: http://localhost:5173 - Python API: http://localhost:8000 - TypeScript API: http://localhost:3002 ## Environment Variables Tạo file `.env.local`: ```bash # MongoDB MONGODB_URI=mongodb+srv://... MONGODB_DATABASE=schedule # Supabase SUPABASE_URL=https://....supabase.co SUPABASE_SERVICE_ROLE_KEY=eyJ... # NAS NAS_BASE_URL=https://disk.lezhin.com:5001/webapi NAS_DSM_URL=https://disk.lezhin.com:5001 NAS_USERNAME=geupload2 NAS_PASSWORD=*** NAS_DESTINATION_PATH=\\172.16.14.240\raw # Chrome profile cho Selenium NAS_CHROME_PROFILE_PATH=chrome_profile_nas # TMS TMS_API_URL=https://tms.kiledel.com TMS_EMAIL=*** TMS_PASSWORD=*** # Optional DRIVER_ADMIN_TOKEN=*** ``` ## Project Structure ``` dkiDownload/ ├── App.tsx # Main React component ├── index.tsx # React entry point ├── types.ts # TypeScript definitions │ ├── components/ # React components (41 files) │ ├── SubmissionForm.tsx # TMS permission form │ ├── SubmissionHistory.tsx # Permission history │ ├── RawDownloadForm.tsx # Raw download form │ ├── DownloadHistory.tsx # Download history │ ├── CheckPage.tsx # Check upload page │ └── ... │ ├── hooks/ # React hooks │ ├── use-tab-visibility.ts # Tab visibility tracking │ └── index.ts │ ├── utils/ # Utilities │ ├── supabase.ts # Supabase client │ ├── use-realtime-downloads.ts │ ├── use-realtime-submissions.ts │ └── sort-utils.ts │ ├── src/ # TypeScript backend (Express) │ ├── server.ts # Express server entry │ ├── config.ts # Configuration │ ├── api/ │ │ └── submissions.ts # Submissions API │ └── services/ │ ├── auth.service.ts # TMS authentication │ ├── tms-api.service.ts # TMS API calls │ ├── supabase.service.ts # Supabase operations │ └── worker.service.ts # Permission worker │ ├── backend/ # Python backend (FastAPI) │ ├── main.py # FastAPI app │ ├── worker.py # TMS permission worker │ ├── worker_downloads.py # Download worker │ ├── routes/ │ │ ├── tms_routes.py # TMS endpoints │ │ ├── raw_api_routes.py # API download endpoints │ │ ├── raw_sharing_routes.py # Sharing link endpoints │ │ ├── downloads_routes.py # Download management │ │ └── custom_paths_routes.py │ └── services/ │ ├── mongodb_service.py │ ├── supabase_service.py │ ├── nas_service.py │ ├── downloads_service.py │ ├── nas_api/ # NAS API package │ ├── nas_sharing_api/ # Selenium sharing package │ └── aria2/ # Aria2 client │ └── aria2/ # Aria2 download tool └── aria2c.exe ``` ## Database Schema (Supabase) | Table | Mô tả | | -------------- | ------------------------------------ | | `sessions` | Auth sessions (TMS, NAS FileStation) | | `submissions` | TMS permission submissions | | `downloads` | File download queue & history | | `custom_paths` | Custom folder paths cho sharing | | `check_list` | Check upload requests | | `chapters` | Chapter management | | `users` | User list for autocomplete | ## Architecture ``` ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ React App │────▶│ Python Backend │────▶│ Synology NAS │ │ (Vite) │ │ (FastAPI:8000) │ │ (FileStation) │ └────────┬────────┘ └────────┬─────────┘ └─────────────────┘ │ │ │ ┌────────▼─────────┐ │ │ Download Worker │ │ │ (Aria2 + API) │ │ └──────────────────┘ │ │ ┌──────────────────┐ ┌─────────────────┐ └─────────────▶│ TS Backend │────▶│ TMS API │ │ (Express:3002) │ │ (REST API) │ └────────┬─────────┘ └─────────────────┘ │ ┌────────▼─────────┐ │ Permission Worker│ └──────────────────┘ │ ┌───────────────────────┴───────────────────────┐ │ Supabase │ │ (Realtime subscriptions + PostgreSQL) │ └───────────────────────────────────────────────┘ ``` ## Key API Endpoints ### TMS Permission - `POST /api/tms/submit` - Submit permission request - `GET /api/tms/submissions` - Get submission history - `DELETE /api/tms/submissions/:id` - Delete submission ### Raw Download (API Mode) - `POST /api/raw-files/list` - List files from NAS - `POST /api/raw-files/download` - Create download job ### Raw Download (Sharing Link) - `POST /api/sharing-link/get-from-db` - Get sharing link from MongoDB - `POST /api/sharing-link/process` - Process sharing link - `POST /api/sharing-link/download` - Download from sharing link ### Download Management - `GET /api/downloads` - Get download queue/history - `DELETE /api/downloads/:id` - Cancel/delete download ### Check Upload - `POST /api/check/submit` - Submit check request - `GET /api/check/history` - Get check history ## License Internal tool for Lezhin Entertainment.