text/noplaylist: replace hyperlink with standard library
- ID
24090cc- date
2026-04-15 20:12:09+00:00- author
Alex Chan <alex@alexwlchan.net>- parent
4833417- message
text/noplaylist: replace hyperlink with standard library- changed files
1 file, 48 additions, 4 deletions
Changed files
text/noplaylist.py (503) → text/noplaylist.py (1543)
diff --git a/text/noplaylist.py b/text/noplaylist.py
index 72f48e9..049c213 100755
--- a/text/noplaylist.py
+++ b/text/noplaylist.py
@@ -9,12 +9,56 @@ to download an entire playlist. This lets me grab just the first video.
"""
import sys
+import urllib.parse
-import hyperlink
+import pytest
+
+
+def noplaylist(url: str) -> str:
+ """
+ Remove the playlist query parameters from a URL.
+ """
+ u = urllib.parse.urlsplit(url)
+
+ query = urllib.parse.parse_qs(u.query)
+ for name in ("list", "index", "pp"):
+ try:
+ del query[name]
+ except KeyError:
+ pass
+
+ return urllib.parse.urlunsplit(
+ (
+ u.scheme,
+ u.netloc,
+ u.path,
+ urllib.parse.urlencode(query, doseq=True),
+ u.fragment,
+ )
+ )
+
+
+@pytest.mark.parametrize(
+ "original_url, url",
+ [
+ (
+ "https://www.youtube.com/watch?v=wrhDXOZoQ74&list=PL7lRfPsqWBLZ9HK6t-BBaVBgRlkLg_FNI&index=4&pp=iAQB",
+ "https://www.youtube.com/watch?v=wrhDXOZoQ74",
+ ),
+ (
+ "https://www.youtube.com/watch?v=wrhDXOZoQ74",
+ "https://www.youtube.com/watch?v=wrhDXOZoQ74",
+ ),
+ ],
+)
+def test_noplaylist(original_url: str, url: str) -> None:
+ """
+ Tests for `noplaylist()`.
+ """
+ assert noplaylist(original_url) == url
if __name__ == "__main__":
url = sys.stdin.read()
- url = hyperlink.parse(url)
- url = url.remove("list")
- sys.stdout.write(str(url))
+ url = noplaylist(url)
+ sys.stdout.write(url)