-
-
Save akash-gajjar/24fc183f6b25c74750606606f2319d01 to your computer and use it in GitHub Desktop.
from datetime import datetime | |
from os import system | |
import requests | |
import json | |
## Please install ffmpeg before running this script and make sure it's in your PATH | |
## brew install ffmpeg | |
## Please install requests before running this script | |
## pip3 install requests | |
## download video from tldv.io | |
## | |
## 1. Go to https://tldv.io/ | |
## 2. Login | |
## 3. Go to the meeting you want to download | |
## 4. Copy the URL of the meeting | |
## 5. Open the developer tools (F12) | |
## 6. Go to the network tab | |
## 7. Refresh the page | |
## 8. Find the request to https://gw.tldv.io/v1/meetings/64145828ced74b0013d496ce/watch-page?noTranscript=true | |
## 9. Copy the auth token from the request headers | |
## 10. Run this script and paste the URL and auth token | |
## 11. python3 tldv.py | |
url = input("Please paste the URL of the meeting you want to download: ") | |
meeting_id = url.split("/")[-1] | |
print("\rFound meeting ID: ", meeting_id) | |
auth_token = input("Auth token: ") | |
data = requests.get( | |
f"https://gw.tldv.io/v1/meetings/{meeting_id}/watch-page?noTranscript=true", | |
headers={ | |
"Authorization": auth_token, | |
}, | |
) | |
try: | |
response = json.loads(data.text) | |
meeting = response.get("meeting", {}) | |
name = meeting.get("name", "No name") | |
createdAt = meeting.get("createdAt", datetime.now()) | |
source = response.get("video", {}).get("source", None) | |
date = datetime.strptime((createdAt), "%Y-%m-%dT%H:%M:%S.%fZ") | |
normalised_date = date.strftime("%Y-%m-%d-%H-%M-%S") | |
filename = f"{normalised_date}_{name}" | |
filename_ext = ".mp4" | |
command = f'ffmpeg -i {source} -c copy "{filename}.{filename_ext}"' | |
json_filename = f'{filename}.json' | |
with open(json_filename, "w") as f: | |
f.write(data.text) | |
print(command) | |
print("Downloading video...") | |
system(command) | |
except: | |
print("Error encountered") | |
print(data.text) |
import os
import re
import json
import requests
from datetime import datetime
from subprocess import run, CalledProcessError
from tqdm import tqdm
#open cmd and type pip3 install requests tqdm
--- Helper Functions ---
def sanitize_filename(name):
return re.sub(r'[\/*?:"<>|]', "_", name)
def get_meeting_id(url):
return url.rstrip("/").split("/")[-1]
def fetch_meeting_data(meeting_id, auth_token):
api_url = f"https://gw.tldv.io/v1/meetings/{meeting_id}/watch-page?noTranscript=true"
response = requests.get(api_url, headers={"Authorization": auth_token})
response.raise_for_status()
return response.json()
def download_video(source_url, output_file):
command = [
"ffmpeg",
"-i", source_url,
"-c", "copy",
output_file
]
try:
run(command, check=True)
print(f"\nβ
Download completed: {output_file}")
except CalledProcessError as e:
print("\nβ Error during download.")
print(e)
--- Main Logic ---
def main():
print("π₯ TLDV Video Downloader")
url = input("Paste the full TLDV meeting URL: ").strip()
if not url:
print("β οΈ URL cannot be empty.")
return
auth_token = input("Paste your auth token: ").strip()
if not auth_token:
print("β οΈ Auth token is required.")
return
meeting_id = get_meeting_id(url)
print(f"π Found Meeting ID: {meeting_id}")
try:
data = fetch_meeting_data(meeting_id, auth_token)
except requests.exceptions.HTTPError as err:
print(f"β Failed to fetch meeting data: {err}")
return
meeting = data.get("meeting", {})
name = sanitize_filename(meeting.get("name", "TLDV_Meeting"))
created_at = meeting.get("createdAt", datetime.now().isoformat())
try:
date_obj = datetime.strptime(created_at, "%Y-%m-%dT%H:%M:%S.%fZ")
except ValueError:
date_obj = datetime.now()
timestamp = date_obj.strftime("%Y-%m-%d-%H-%M-%S")
output_filename = f"{timestamp}_{name}.mp4"
source_url = data.get("video", {}).get("source")
if not source_url:
print("β Video source not found.")
return
print(f"\n㪠Title: {name}")
print(f"π
Created At: {timestamp}")
print(f"π― Output File: {output_filename}")
confirm = input("\nProceed with download? (y/n): ").strip().lower()
if confirm != 'y':
print("β Download canceled.")
return
json_backup = f"{timestamp}_{name}.json"
with open(json_backup, "w") as f:
json.dump(data, f, indent=2)
print(f"π Metadata saved to {json_backup}")
print("β¬ Downloading video...")
download_video(source_url, output_filename)
--- Run ---
if name == "main":
main()
Works like a charm! I added a fork with parallel downloading in case you need to download and process multiple at a time. I obtained links with selenium, and then made a list of videos. The MAX_WORKERS are basically the number of parallel videos to download and process. This makes the process way much faster.
I've used this from javier-ortizt
I'm a newbie here, but I'm so glad I got it to work haha! Basically, I installed ffmpeg on my Mac using Homebrew (I followed this tutorial) and once it's set up, I ran the command
python3 tldv.py
Thanks so much!!
Si desconozco todo lo que menciona porque no soy ingeniero de sistemas o relacionado. Deberia aplicar esto en mi laptop. me recomiendan algun tema en particular para aprender mas de esto por favor. se me van a borrar esos videos en 2 semanas y los necesito pero no puedo pagar el premium