A powerful, standalone Python tool for downloading and processing webinar recordings from MTS Link (my.mts-link.ru). Automatically downloads segmented videos, synchronizes audio/video tracks, and creates a single compiled MP4 file.
- ๐ Standalone Python script - No Docker required, works anywhere Python runs
- ๐ฏ Dual interface - Interactive mode for beginners & CLI for automation
- ๐ Session authentication - Supports private recordings with session IDs
- ๐ Progress tracking - Visual progress bars for downloads and processing
- ๐จ Smart compilation - Handles gaps between segments automatically
- โก Efficient processing - Multi-threaded encoding with MoviePy
- ๐ Organized output - Creates structured directories for each webinar
- ๐งน Cleanup options - Automatic cleanup of temporary files
- ๐ง Easy installation - One-command setup script available
- Python 3.7 or higher
- 2GB+ free disk space (for typical webinars)
- Stable internet connection
For macOS/Linux:
git clone https://github.com/SirAndrewGotham/mtser.git
cd mtser
chmod +x install.sh
./install.shFor Windows:
git clone https://github.com/SirAndrewGotham/mtser.git
cd mtser
install.batgit clone https://github.com/SirAndrewGotham/mtser.git
cd mtser
python setup.pygit clone https://github.com/SirAndrewGotham/mtser.git
cd mtser
# Create virtual environment
python3 -m venv venv
# Activate it (macOS/Linux)
source venv/bin/activate
# Or on Windows
# venv\Scripts\activate
# Install dependencies
pip install httpx tqdm moviepy numpyInteractive mode (recommended for beginners):
python mtser.py --interactiveCommand-line mode:
# Public recording
python mtser.py https://my.mts-link.ru/12345678/987654321/record-new/123456789
# Private recording with session ID
python mtser.py https://my.mts-link.ru/12345678/987654321/record-new/123456789/record-file/1234567890 --session-id your_session_idUsing the alias (after running install.sh):
mtser --interactiveThe tool supports both MTS Link URL formats:
-
Regular meeting (with record-file):
https://my.mts-link.ru/{organization_id}/{room_id}/record-new/{event_sessions}/record-file/{record_id} -
Quick meeting (without record-file):
https://my.mts-link.ru/{organization_id}/{room_id}/record-new/{event_sessions}
For private recordings, you need a sessionId from your browser:
- Log into MTS Link in your browser
- Open Developer Tools (F12)
- Go to Application โ Storage โ Cookies
- Find and copy the
sessionIdvalue - Use it with the
--session-idparameter
usage: mtser.py [-h] [--session-id SESSION_ID] [--output-dir OUTPUT_DIR]
[--max-duration MAX_DURATION] [--keep-files] [--interactive]
[--quiet] [--debug]
[url]
Download and process MTS Link webinar recordings
positional arguments:
url Webinar URL (optional in interactive mode)
options:
-h, --help show this help message and exit
--session-id SESSION_ID
Session ID token for private recordings (get from browser cookies)
--output-dir OUTPUT_DIR
Output directory for downloaded files (default: downloads)
--max-duration MAX_DURATION
Maximum video duration in seconds (optional)
--keep-files Keep downloaded segment files after processing
--interactive, -i Run in interactive mode (ignores other arguments except URL)
--quiet, -q Suppress interactive prompts and progress output
--debug, -d Enable debug mode for troubleshootingpython mtser.py https://my.mts-link.ru/88314261/9993004207/record-new/9556828372/record-file/1694976671python mtser.py https://my.mts-link.ru/12345678/987654321/record-new/123456789 \
--session-id a1b2c3d4e5f6 \
--output-dir "my_webinars" \
--max-duration 3600 \
--keep-files#!/bin/bash
URLS=(
"https://my.mts-link.ru/123/456/record-new/789"
"https://my.mts-link.ru/987/654/record-new/321/record-file/123"
)
for url in "${URLS[@]}"; do
echo "Processing: $url"
python mtser.py "$url" --quiet --output-dir "batch_downloads"
echo "Completed: $url"
echo "---"
donedownloads/ (or your specified output directory)
โโโ Webinar_Name_2026-01-28_17_06_28/
โ โโโ segment_abc123.mp4 # Individual segments (if --keep-files)
โ โโโ segment_def456.mp4
โ โโโ ...
โ โโโ Webinar_Name_2026-01-28_17_06_28.mp4 # Final compiled video
โโโ Another_Webinar_2026-01-29/
โ โโโ Another_Webinar_2026-01-29.mp4
โโโ logs/
โโโ mtser.log # Detailed log file
- URL Parsing: Extracts
event_sessionsandrecord_idfrom the URL - Metadata Fetch: Retrieves webinar metadata from MTS Link API
- Segment Download: Downloads all video/audio segments (typically 1000+ files)
- Timing Analysis: Processes
relativeTimefrom metadata for synchronization - Gap Filling: Inserts black video and silent audio between segments
- Compilation: Combines all segments into a single MP4 file using MoviePy
- Cleanup: Optionally removes temporary segment files
- Browser-like headers: Mimics real browser behavior to avoid blocking
- Resumable downloads: Supports Range headers for large files
- Memory efficient: Processes segments sequentially to avoid memory issues
- Error recovery: Handles network interruptions gracefully
- Format detection: Automatically identifies video vs audio segments
-
"Access denied" error
- Ensure you're using a valid, non-expired
sessionId - Check that the webinar isn't restricted to specific users
- Ensure you're using a valid, non-expired
-
No video/audio clips found
- The webinar might be empty or have no recordings
- Try with
--debugflag to save raw data for inspection - Verify the URL format is correct
-
MoviePy import errors
pip uninstall moviepy pip install moviepy==1.0.3
-
Slow downloads
- Check your internet connection
- The server might be rate limiting; try again later
- Consider using
--max-durationfor partial downloads
-
Memory errors with long webinars
- Use
--max-durationto limit processing - Ensure you have sufficient RAM (4GB+ recommended)
- Close other memory-intensive applications
- Use
For detailed troubleshooting:
python mtser.py --interactive --debug
# This saves raw JSON data to debug_data.json for inspectionCheck the log file:
tail -f logs/mtser.logThe project includes multiple installation options:
- Creates virtual environment automatically
- Installs all dependencies
- Makes the script executable
- Provides alias setup for easy usage
- Creates virtual environment
- Installs dependencies
- Provides activation instructions
- Interactive setup script
- Checks Python version
- Installs all required packages
- Creates executable shortcuts
- List of all required Python packages
- Can be used with
pip install -r requirements.txt
We welcome contributions! Here's how you can help:
- Fork the repository
- Create a virtual environment:
python -m venv venv source venv/bin/activate # On Windows: venv\Scripts\activate
- Install development dependencies:
pip install -r requirements.txt
- Follow PEP 8 style guide
- Use type hints for function signatures
- Add docstrings for all public functions
- Write tests for new features
- Update the documentation as needed
# Run basic tests
python -m pytest tests/
# Test specific functionality
python tests/test_url_parsing.py- Create a feature branch
- Make your changes
- Add or update tests
- Update documentation
- Submit a pull request
- Use
--max-durationto download only portions - Increase chunk size for faster downloads (modify
chunk_sizein code) - Use SSD storage for faster file operations
- Close other network-intensive applications
- Run multiple instances with different output directories
- Use shell scripts for batch processing
- Monitor disk space for large downloads
- Parallel segment downloads
- YouTube/Dropbox integration
- Web interface (Flask/Django)
- Mobile application
- Scheduled downloads
- Email notifications
- Transcript generation
- CMS Integration: WordPress/Drupal plugins
- Learning Management Systems: Moodle, Canvas integration
- Cloud Storage: Direct upload to cloud services
- Video Platforms: Automatic YouTube/Vimeo publishing
from mtser import MTSLinkerDownloader, WebinarProcessor
# Initialize
downloader = MTSLinkerDownloader()
processor = WebinarProcessor("output_dir")
# Process webinar
event_sessions, record_id = downloader.extract_ids_from_url(url)
json_data = downloader.fetch_webinar_data(api_url, session_id)
if json_data:
video_clips, audio_clips, duration = processor.download_and_process_segments(json_data, downloader)
processor.compile_final_video(video_clips, audio_clips, duration, "output.mp4")- Metadata:
https://my.mts-link.ru/api/event-sessions/{id}/record-files/{id}/flow?withoutCuts=false - Segments:
https://events-storage.webinar.ru/api-storage/files/wowza/{year}/{month}/{day}/{hash}.mp4
This project is licensed under the MIT License - see the LICENSE file for details.
Andrew Gotham
- GitHub: @SirAndrewGotham
- Email: andreogotema@gmail.com
- Telegram: @SirAndrewGotham
- MoviePy team for the excellent video editing library
- httpx developers for the modern HTTP client
- tqdm team for the beautiful progress bars
- MTS Link users for testing and feedback
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Email: andreogotema@gmail.com
- Telegram: @SirAndrewGotham
If this project helped you, please give it a โญ on GitHub!
Note: This tool is for personal/educational use. Always respect copyright laws and terms of service. Ensure you have permission to download and use webinar recordings.
Last updated: 2026-02-01