246 lines
8.8 KiB
Markdown
Executable File
246 lines
8.8 KiB
Markdown
Executable File
# 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 <repository-url>
|
||
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.
|