A local web tool to transfer videos between two YouTube channels. Includes a Chrome extension for automated YouTube Studio uploads.
- OAuth Authentication - Connect two YouTube channels securely
- Video Transfer - Download from source, upload to destination, delete from source
- Download Only - Download videos with metadata for manual upload
- Delete from Source - Clean up source channel after transfer
- Shorts Support - Automatically detects and handles YouTube Shorts
- Chrome Extension - Auto-fill metadata in YouTube Studio
- Node.js (v18+)
- yt-dlp (
brew install yt-dlp) - YouTube API credentials from Google Cloud Console
git clone https://github.com/umutcetinkaya/youtube-transfer.git
cd youtube-transfer
npm install- Go to Google Cloud Console
- Create a new project or select existing
- Enable YouTube Data API v3
- Create OAuth 2.0 credentials:
- Application type: Web application
- Authorized redirect URI:
http://localhost:3000/auth/callback
- Configure OAuth consent screen
cp .env.example .envEdit .env:
YOUTUBE_CLIENT_ID=your-client-id.apps.googleusercontent.com
YOUTUBE_CLIENT_SECRET=your-client-secret
PORT=3000
# macOS
brew install yt-dlp
# or with pip
pip install yt-dlpnpm start- Click Connect on Source Channel → OAuth login
- Click Connect on Destination Channel → OAuth login (different account)
- Select videos from source channel
- Click Transfer to move videos
- Connect source channel
- Select videos
- Click Download Only
- Videos saved to
~/Downloads/youtube-transfer/
The extension auto-fills metadata when uploading to YouTube Studio manually.
- Open
chrome://extensions - Enable Developer mode
- Click Load unpacked
- Select the
extension/folder
- Download videos using "Download Only" in the web app
- Click extension popup → Select video → Open in YouTube Studio
- Select the video file (path is copied to clipboard)
- Metadata auto-fills → Click Publish
YouTube API has daily quotas:
- ~6 video uploads per day via API
- Use "Download Only" + manual upload to bypass limits
youtube-transfer/
├── server.js # Express server + OAuth + API
├── public/
│ └── index.html # Web UI
├── extension/ # Chrome extension
│ ├── manifest.json
│ ├── popup.html/js
│ ├── content.js/css
│ └── background.js
├── .env.example
└── package.json
This tool is for personal use and educational purposes only. Please ensure you:
- ✅ Only transfer videos you own or have permission to use
- ✅ Comply with YouTube's Terms of Service
- ✅ Respect copyright laws and intellectual property rights
- ✅ Do not use this tool to download or distribute copyrighted content without authorization
The authors are not responsible for any misuse of this software.
Contributions are welcome! Here's how you can help:
- Check if the bug is already reported in Issues
- If not, create a new issue with:
- Clear description of the bug
- Steps to reproduce
- Expected vs actual behavior
- Your environment (OS, Node.js version, browser)
- Screenshots if applicable
- Open an issue with the
enhancementlabel - Describe the feature and its use case
- Explain why it would be useful
- Fork the repository
- Create a feature branch:
git checkout -b feature/your-feature-name - Make your changes
- Test thoroughly
- Commit with clear messages:
git commit -m "Add feature: description" - Push to your fork:
git push origin feature/your-feature-name - Open a Pull Request
- Use consistent indentation (2 spaces)
- Add comments for complex logic
- Follow existing code style
- Test your changes before submitting
MIT License - see LICENSE file for details
