Add content CLI
This commit is contained in:
1 parent
3da32a4a90
commit
661ee019e5
10 files changed
+387
No files matched your search
@@ -0,0 +1,39 @@
|
||||
import json
|
||||
import re
|
||||
import urllib.parse
|
||||
import urllib.request
|
||||
|
||||
VIDEO_ID_PATTERN = re.compile(r"^[\w-]{11}$")
|
||||
YOUTUBE_HOSTS = {"youtube.com", "www.youtube.com", "m.youtube.com", "music.youtube.com", "youtu.be"}
|
||||
PATH_PREFIXES = ("/shorts/", "/embed/", "/live/")
|
||||
|
||||
|
||||
def video_id(text: str) -> str | None:
|
||||
text = text.strip()
|
||||
if VIDEO_ID_PATTERN.match(text):
|
||||
return text
|
||||
|
||||
url = urllib.parse.urlparse(text if "://" in text else f"https://{text}")
|
||||
if url.hostname not in YOUTUBE_HOSTS:
|
||||
return None
|
||||
if url.hostname == "youtu.be":
|
||||
candidate = url.path.strip("/").split("/")[0]
|
||||
elif url.path == "/watch":
|
||||
candidate = urllib.parse.parse_qs(url.query).get("v", [""])[0]
|
||||
else:
|
||||
prefix = next((prefix for prefix in PATH_PREFIXES if url.path.startswith(prefix)), None)
|
||||
candidate = url.path[len(prefix):].split("/")[0] if prefix else ""
|
||||
return candidate if VIDEO_ID_PATTERN.match(candidate) else None
|
||||
|
||||
|
||||
def watch_url(identifier: str) -> str:
|
||||
return f"https://music.youtube.com/watch?v={identifier}"
|
||||
|
||||
|
||||
def video_title(identifier: str) -> str | None:
|
||||
query = urllib.parse.urlencode({"url": f"https://www.youtube.com/watch?v={identifier}", "format": "json"})
|
||||
try:
|
||||
with urllib.request.urlopen(f"https://www.youtube.com/oembed?{query}", timeout=10) as response:
|
||||
return json.load(response).get("title")
|
||||
except (OSError, ValueError):
|
||||
return None
|
||||
Reference in new issue
Block a user