Skip to content

Instantly share code, notes, and snippets.

@mercutiodesign
Last active January 17, 2022 22:37
Show Gist options
  • Save mercutiodesign/1e365d09a1fa4bb42d8bad9184956a3b to your computer and use it in GitHub Desktop.
Save mercutiodesign/1e365d09a1fa4bb42d8bad9184956a3b to your computer and use it in GitHub Desktop.
#!/bin/env python3
import re
import subprocess
import sys
from pathlib import Path
# enter links to some .m3u8 URLs here
links = """
""".split()
# change target folder here
target_folder = Path("~/Videos")
tasks = []
for link in links:
if "/shows/" in link:
kind = "Shows"
match = re.search(r"shows/\d+-([^/]+)-(\d+)/\d+-S(\d+)-?E(\d+)-\d+/", link)
assert match, f"cannot find match in link: {link}"
title, year, season, episode = match.groups()
title = " ".join(title.split("-")).title()
folder = target_folder / kind / title
name = f"{title} ({year}) S{int(season):02d}E{int(episode):02d}"
tasks.append((folder, name, link))
elif "/movies/" in link:
kind = "Movies"
match = re.search(r"/movies/(?:\d+-)?([^/]+)-(\d\d\d\d)(?:-\d+)?/", link)
assert match, f"cannot find match in link: {link}"
title, year = match.groups()
title = " ".join(title.split("-")).title()
folder = target_folder / kind
name = f"{title} ({year})"
tasks.append((folder, name, link))
folders = sorted({f for f, _, _ in tasks})
print(f"creating {len(folders)} folders: {[str(f) for f in folders]}")
for folder in folders:
folder.mkdir(parents=True, exist_ok=True)
print(f"downloading {len(tasks)} items")
for i, (folder, name, link) in enumerate(tasks, start=1):
print(f">>>>> downloading {i} / {len(tasks)}: {name} to {folder} from {link} <<<<<")
cmd = ["youtube-dl", "-o", f"{folder / name}.%(ext)s", link]
subprocess.run(cmd, stdout=sys.stdout, stderr=sys.stderr, check=True)
python downloader.py
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment