iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A working full-stack video downloader: a single-file bilingual (Arabic/English) frontend and a FastAPI backend powered by yt-dlp.
Supported platforms: YouTube, TikTok, Instagram, Facebook, Pinterest, X/Twitter, Reddit, Dailymotion (anything yt-dlp supports for these domains).
Requirements: Python 3.10+, and ffmpeg installed on the system (required for merging video+audio streams and for MP3 audio extraction).
Copy the environment template and adjust as needed:README 전문 보기 ↗A working full-stack video downloader: a single-file bilingual (Arabic/English) frontend and a FastAPI backend powered by yt-dlp.
universal-downloader/
├── frontend/
│ └── index.html # Single-page bilingual UI (HTML+CSS+JS, no build step)
├── backend/
│ ├── main.py # FastAPI app: info/download/audio endpoints
│ ├── requirements.txt
│ └── downloads/ # Temporary storage, auto-cleaned (created at runtime)
├── .env.example
└── README.md
Supported platforms: YouTube, TikTok, Instagram, Facebook, Pinterest, X/Twitter, Reddit, Dailymotion (anything yt-dlp supports for these domains).
Requirements: Python 3.10+, and ffmpeg installed on the system (required for merging video+audio streams and for MP3 audio extraction).
# Install ffmpeg (Debian/Ubuntu)
sudo apt-get install -y ffmpeg
# macOS
brew install ffmpeg
Then install the Python dependencies:
cd backend
python -m venv venv
source venv/bin/activate # Windows: venv\Scripts\activate
pip install -r requirements.txt
Copy the environment template and adjust as needed:
cd ..
cp .env.example .env
cd backend
uvicorn main:app --reload --host 0.0.0.0 --port 8000
The API is now live at http://localhost:8000. Interactive API docs (Swagger UI) are auto-generated by FastAPI at http://localhost:8000/docs.
Confirm it's healthy:
curl http://localhost:8000/api/health
# {"status":"ok"}
frontend/index.html is a static file — no build tools needed. Two ways to serve it:
Option A — open directly:
Just open frontend/index.html in your browser. It calls the backend at http://localhost:8000 by default.
Option B — serve over HTTP (recommended, avoids file:// quirks):
cd frontend
python -m http.server 5500
# then open http://localhost:5500
If your backend runs on a different host/port, set window.API_BASE_URL before the page's script runs, e.g. add this in <head>:
<script>window.API_BASE_URL = "https://your-backend-domain.com";</script>
and set ALLOWED_ORIGINS in .env to your frontend's origin (not *) in production.
GET /api/healthHealth check.
{ "status": "ok" }
POST /api/infoFetch metadata for a video URL.
Request:
{ "url": "https://www.youtube.com/watch?v=..." }
Response:
{
"success": true,
"platform": "youtube",
"title": "...",
"thumbnail": "...",
"duration": 213,
"uploader": "...",
"view_count": 12345,
"formats": [
{ "format_id": "137", "height": 1080, "label": "1080p", "ext": "mp4", "filesize": 45312000, "fps": 30 }
],
"has_audio": true
}
POST /api/downloadDownload a specific video format (server merges best matching audio automatically).
Request:
{ "url": "https://www.youtube.com/watch?v=...", "format_id": "137" }
Response:
{
"success": true,
"job_id": "a1b2c3...",
"filename": "My Video.mp4",
"download_url": "/api/file/a1b2c3.../My%20Video.mp4",
"size_mb": 42.7
}
The frontend then fetches download_url (prefixed with the API base) to save the file.
POST /api/audioDownload audio only, converted to MP3 (192kbps).
Request:
{ "url": "https://www.youtube.com/watch?v=..." }
Response: same shape as /api/download.
GET /api/file/{job_id}/{filename}Serves the prepared file. job_id must be a 32-character hex UUID; path traversal is blocked by validating the resolved path stays inside the download directory.
All handled errors return:
{ "success": false, "error_code": "PRIVATE_VIDEO", "message": "This video is private and cannot be accessed." }
Possible error_code values: INVALID_URL, UNSUPPORTED_PLATFORM, FORBIDDEN_HOST, PRIVATE_VIDEO, LOGIN_REQUIRED, REGION_RESTRICTED, AGE_RESTRICTED, VIDEO_UNAVAILABLE, VIDEO_TOO_LONG, FILE_TOO_LARGE, RATE_LIMIT_EXCEEDED, SERVER_BUSY, DOWNLOAD_FAILED, SERVER_ERROR.
http:// and https:// URLs are accepted.localhost, 127.0.0.1, 0.0.0.0, and ::1 are explicitly blocked.RATE_LIMIT_SECONDS, default 3s) is enforced in-memory on every endpoint. For multi-process deployments, replace the in-memory dict with Redis.MAX_FILE_SIZE_MB and MAX_VIDEO_DURATION_SECONDS are enforced before and after download.MAX_CONCURRENT_DOWNLOADS caps simultaneous yt-dlp jobs.FILE_RETENTION_SECONDS (default 30 min) are deleted opportunistically on each incoming request. For production, also run a cron/scheduled task calling the same cleanup logic, or move to a background worker.ALLOWED_ORIGINS in .env to your actual frontend origin(s) in production; do not leave it as * when serving real traffic.This project does not rely on public CORS proxies or anonymous third-party "free" download APIs as its core mechanism — all downloads go through your own backend running yt-dlp, as required.
LOGIN_REQUIRED / PRIVATE_VIDEO error.yt-dlp upgraded (pip install -U yt-dlp) if extraction starts failing for a given site./api/download and /api/audio endpoints are synchronous (they block until the file is ready, then return a download link); the frontend shows an indeterminate progress bar rather than true byte-level progress. Adding WebSocket or Server-Sent-Events progress reporting is a natural next step.localStorage only; nothing is tracked server-side beyond the temp files.DOWNLOAD_FAILED.