aboutsummaryrefslogtreecommitdiff
path: root/yt_music
diff options
context:
space:
mode:
Diffstat (limited to 'yt_music')
-rw-r--r--yt_music/__init__.py0
-rw-r--r--yt_music/__main__.py7
-rw-r--r--yt_music/__version__.py1
-rw-r--r--yt_music/__yt_music__.py92
4 files changed, 100 insertions, 0 deletions
diff --git a/yt_music/__init__.py b/yt_music/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/yt_music/__init__.py
diff --git a/yt_music/__main__.py b/yt_music/__main__.py
new file mode 100644
index 0000000..cfe86c2
--- /dev/null
+++ b/yt_music/__main__.py
@@ -0,0 +1,7 @@
+from . import __yt_music__
+
+def __ytmusic__():
+ __yt_music__
+
+if __name__ == "__main__":
+ __ytmusic__()
diff --git a/yt_music/__version__.py b/yt_music/__version__.py
new file mode 100644
index 0000000..919a733
--- /dev/null
+++ b/yt_music/__version__.py
@@ -0,0 +1 @@
+__core__ = "0.0.1a"
diff --git a/yt_music/__yt_music__.py b/yt_music/__yt_music__.py
new file mode 100644
index 0000000..c87a6fd
--- /dev/null
+++ b/yt_music/__yt_music__.py
@@ -0,0 +1,92 @@
+import sys
+import re
+import subprocess
+
+import httpx
+import fzf
+
+headers = {
+ "User-Agent": "Mozilla/5.0 (X11; Linux x86_64; rv:109.0) Gecko/20100101 Firefox/115.0"
+}
+
+client = httpx.Client(headers=headers, timeout=None)
+
+base_url = "https://vid.puffyan.us"
+pattern = r'<a.*?href="/watch\?v=(.*?)".*?><p.*?>(.*?)<\/p></a>'
+
+MPV_EXECUTABLE = "mpv"
+
+try:
+ if len(sys.argv) == 1:
+ query = input("Search: ")
+ if query == "":
+ print("ValueError: no query parameter provided")
+ exit(1)
+ else:
+ query = " ".join(sys.argv[1:])
+except KeyboardInterrupt:
+ exit(0)
+
+query = query.replace(' ', '+')
+opts = []
+
+
+def extract_video_id(video_title):
+ pattern = r' - (\w+)$'
+
+ match = re.search(pattern, video_title)
+
+ if match:
+ video_id = match.group(1)
+ return video_id
+ else:
+ return None
+
+def play_loop(video_id, video_title):
+
+ args = [
+ MPV_EXECUTABLE,
+ f"https://music.youtube.com/watch?v={video_id}",
+ f"--force-media-title={video_title}",
+ "--no-video",
+ "--loop",
+ ]
+
+ mpv_process = subprocess.Popen(args, stdout=subprocess.DEVNULL)
+ mpv_process.wait()
+
+
+
+def play(video_id, video_title):
+
+ args = [
+ MPV_EXECUTABLE,
+ f"https://music.youtube.com/watch?v={video_id}",
+ f"--force-media-title={video_title}",
+ "--no-video",
+ ]
+
+ mpv_process = subprocess.Popen(args, stdout=subprocess.DEVNULL)
+ mpv_process.wait()
+
+
+def main():
+ fetch = client.get(f"{base_url}/search?q={query}")
+ matches = re.findall(pattern, fetch.text)
+ for match in matches:
+ video_id, title = match
+ opt = f"{title} - {video_id}"
+ opts.append(opt)
+ ch = fzf.fzf_prompt(opts)
+ print(ch)
+ idx = extract_video_id(ch)
+ play_ch = fzf.fzf_prompt(["play", "loop"])
+ try:
+ if play_ch == "play":
+ play(idx, ch)
+ else:
+ play_loop(idx, ch)
+ except KeyboardInterrupt:
+ exit(0)
+
+main()