Skip to main content

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)