]> njoseph.me Git - nimcoon.git/blobdiff - clitube.nim
strformat everywhere! 🥳
[nimcoon.git] / clitube.nim
index 95c83a5804c988669d878b1e99ac13e576606470..89e863cb5bdf8af381fb44cbf9ac0f3dc466b8ba 100644 (file)
@@ -3,6 +3,7 @@ import httpClient
 import os
 import osproc
 import sequtils, sugar
+import strformat
 import std/[terminal]
 import strtabs
 import strutils
@@ -10,7 +11,7 @@ import uri
 import xmltree
 
 # Supported video players in order of preference
-let supportedPlayers = @["mpv", "vlc"]
+let supportedPlayers = ["mpv", "vlc"]
 
 # Only show these many results
 let limit = 10
@@ -20,20 +21,19 @@ type SearchResult = tuple[title: string, url: string]
 proc selectMediaPlayer(): string =
   let availablePlayers = filterIt(supportedPlayers, execProcess("which " & it).len != 0)
   if len(availablePlayers) == 0:
-    stderr.writeLine "Please install one of the supported media players: ", $supportedPlayers
+    stderr.writeLine &"Please install one of the supported media players: {supportedPlayers}"
     raise newException(OSError, "No supported media player found")
   else:
     return availablePlayers[0]
 
 proc getYoutubePage(searchQuery: string): string =
   let queryParam = encodeUrl(searchQuery)
-  var client = newHttpClient()
-  let response = get(client, "https://www.youtube.com/results?hl=en&search_query=" & queryParam)
-  writeFile("/tmp/clitube-page.html", response.body)
-  return "/tmp/clitube-page.html"
+  let client = newHttpClient()
+  let response = get(client, &"https://www.youtube.com/results?hl=en&search_query={queryParam}")
+  return $response.body
 
 proc extractTitlesAndUrls(htmlFile: string): seq[SearchResult] =
-  loadHtml(htmlFile).findAll("a").
+  parseHtml(htmlFile).findAll("a").
     filter(a => "watch" in a.attrs["href"] and a.attrs.hasKey "title").
     map(a => (a.attrs["title"], "https://www.youtube.com" & a.attrs["href"]))[..(limit-1)]
 
@@ -46,7 +46,7 @@ let input = paramStr(1)
 let player = selectMediaPlayer()
 
 if "https://www.youtube.com" in input:
-  discard execProcess(player & " " & input)
+  discard execProcess(&"{player} {input}")
   quit(0)
 
 let searchResults = extractTitlesAndUrls(getYoutubePage(input))
@@ -54,9 +54,9 @@ let searchResults = extractTitlesAndUrls(getYoutubePage(input))
 presentVideoOptions(searchResults)
 
 stdout.styledWrite(fgYellow, "Choose video number: ")
-var number: int = parseInt(readLine(stdin))
+let number: int = parseInt(readLine(stdin))
 
 styledEcho "\n", fgGreen, "Playing ", styleBright, fgMagenta, searchResults[number].title
 
 # Play the video using the preferred/available media player
-discard execProcess(player & " " & searchResults[number].url)
+discard execProcess(&"{player}  {searchResults[number].url}")