utils/download_videos.py (53 lines of code) (raw):
import os
import re
import requests
def fetch_issue(issue_number):
url = f"https://api.github.com/repos/Expensify/App/issues/{issue_number}"
headers = {
"Accept": "application/vnd.github.v3+json",
"User-Agent": "ExpensifyVideoDownloader"
}
try:
response = requests.get(url, headers=headers)
response.raise_for_status()
return response.json()
except Exception as e:
print(f"Error fetching issue {issue_number}: {e}")
return None
def download_issue_videos(issue):
title = issue.get('title', '<No Title>')
body = issue.get('body', '')
print("Issue Title:", title)
print("Issue Body:", body)
video_urls = re.findall(r'(https?://[^\s]+?\.(?:mp4|mov))', body)
if not video_urls:
print("No .mp4 or .mov files found in the issue body.")
return
issue_id = str(issue.get('number') or issue.get('id', 'unknown'))
destination_dir = os.path.join("issue_videos", issue_id)
os.makedirs(destination_dir, exist_ok=True)
for url in video_urls:
video_name = os.path.basename(url.split('?')[0])
destination_path = os.path.join(destination_dir, video_name)
print(f"Downloading {url} to {destination_path} ...")
try:
video_response = requests.get(url, stream=True)
video_response.raise_for_status()
with open(destination_path, 'wb') as out_file:
for chunk in video_response.iter_content(chunk_size=8192):
if chunk:
out_file.write(chunk)
print(f"Downloaded {video_name} successfully.")
except Exception as e:
print(f"Error downloading {url}: {e}")
def fetch_and_download_issue_videos(issue_number):
issue = fetch_issue(issue_number)
if issue is not None:
download_issue_videos(issue)
if __name__ == '__main__':
import sys
if len(sys.argv) < 2:
print("Usage: python utils/download_videos.py <issue_number>")
else:
issue_number = sys.argv[1]
fetch_and_download_issue_videos(issue_number)