]> njoseph.me Git - nimcoon.git/blobdiff - src/lib.nim
pagination: "n" takes to next page of results
[nimcoon.git] / src / lib.nim
index 1b6ed93770f0571ec0d9df915cb4302371637e17..54259e2d9f7d08237c3bb73ec51e30fb9751167a 100644 (file)
@@ -20,9 +20,10 @@ type
   Options* = Table[string, bool]
   SearchResult* = tuple[title: string, url: string]
   CommandLineOptions* = tuple[searchQuery: string, options: Options]
+  SelectionRange* = tuple[begin: int, until: int]
 
 # poEchoCmd can be added to options for debugging
-let processOptions = {poStdErrToStdOut, poUsePath, poEchoCmd}
+let processOptions = {poStdErrToStdOut, poUsePath}
 
 proc selectMediaPlayer*(): string =
   let availablePlayers = filterIt(supportedPlayers, execProcess("which " & it).len != 0)
@@ -51,7 +52,26 @@ proc presentVideoOptions*(searchResults: seq[SearchResult]) =
 
 proc play*(player: string, args: openArray[string], title: string) =
   styledEcho "\n", fgGreen, "Playing ", styleBright, fgMagenta, title
-  discard execProcess(player, args=args, options=processOptions)
+  if "--no-video" in args:
+    discard execShellCmd(&"{player} {args.join(\" \")}")
+  else:
+    discard execProcess(player, args=args, options=processOptions)
+
+func buildMusicDownloadArgs*(url: string): seq[string] =
+  {.noSideEffect.}:
+    var args = @["--ignore-errors", "-f", "bestaudio", "--extract-audio", "--audio-format", "mp3", "--audio-quality", "0", "-o"]
+    let downloadLocation = &"'{expandTilde(musicDownloadDirectory)}/%(title)s.%(ext)s'"
+    args.add(downloadLocation)
+    args.add(url)
+    return args
+
+func buildVideoDownloadArgs*(url: string): seq[string] =
+  {.noSideEffect.}:
+    var args = @["-f", "best", "-o"]
+    let downloadLocation = &"'{expandTilde(videoDownloadDirectory)}/%(title)s.%(ext)s'"
+    args.add(downloadLocation)
+    args.add(url)
+    return args
 
 proc download*(args: openArray[string], title: string) =
   styledEcho "\n", fgGreen, "Downloading ", styleBright, fgMagenta, title
@@ -66,9 +86,20 @@ func stripZshEscaping(url: string): string =
 func sanitizeURL*(url: string): string =
   urlLongen(stripZshEscaping(url))
 
-proc directPlay*(searchQuery: string, player: string) =
-  let url = sanitizeURL(searchQuery)
-  if searchQuery.startswith("magnet:"):
-    discard execProcess("peerflix", args=[url, &"--{player}"], options=processOptions)
+proc directPlay*(url: string, player: string, musicOnly: bool) =
+  if url.startswith("magnet:"):
+    if musicOnly:
+      discard execShellCmd(&"peerflix '{url}' -a --{player} -- --no-video")
+    else:
+      discard execProcess("peerflix", args=[url, &"--{player}"], options=processOptions)
   else:
-    discard execProcess(player, args=[url], options=processOptions)
+    if musicOnly:
+      discard execShellCmd(&"{player} --no-video {url}")
+    else:
+      discard execProcess(player, args=[url], options=processOptions)
+
+proc directDownload*(url: string, musicOnly: bool) =
+  let args =
+    if musicOnly: buildMusicDownloadArgs(url)
+    else: buildVideoDownloadArgs(url)
+  discard execShellCmd(&"youtube-dl {args.join(\" \")}")