import
+ os,
parseopt,
std/[terminal],
strformat,
proc isValidOptions*(options: Options): bool =
# Check for invalid combinations of options
- var invalidCombinations = [("musicOnly", "fullScreen")]
+ var invalidCombinations = [("musicOnly", "fullScreen"), ("download", "fullScreen")]
for combination in invalidCombinations:
if options[combination[0]] and options[combination[1]]:
stderr.writeLine fmt"Incompatible options provided: {combination[0]} and {combination[1]}"
quit(1)
if searchQuery.startswith("https:") or searchQuery.startswith("magnet:"):
- directPlay(searchQuery, player)
+ if options["download"]:
+ directDownload(sanitizeURL(searchQuery), options["musicOnly"])
+ else:
+ directPlay(sanitizeURL(searchQuery), player, options["musicOnly"])
quit(0)
let searchResults = extractTitlesAndUrls(getYoutubePage(searchQuery))
readLine(stdin)
# This is a pure function with no side effects
- func buildArgs(number: int): seq[string] =
+ func buildPlayerArgs(number: int): seq[string] =
var args = @[searchResults[number].url]
if options["musicOnly"]: args.add("--no-video")
if options["fullScreen"]: args.add("--fullscreen")
return args
+ proc handleUserInput(number: int) =
+ if options["download"]:
+ if options["musicOnly"]:
+ download(buildMusicDownloadArgs(searchResults[number].url), searchResults[number].title)
+ else:
+ download(buildVideoDownloadArgs(searchResults[number].url), searchResults[number].title)
+ else:
+ play(player, buildPlayerArgs(number), searchResults[number].title)
+
+
while(true):
let userInput = getUserInput()
if userInput == "all":
for number in 0..(len(searchResults)):
- play(player, buildArgs(number), searchResults[number].title)
+ # TODO `spawn` this?
+ handleUserInput(number)
if userInput == "q":
break
# Play the video using the preferred/available media player
let videoNumber = parseInt(userInput)
- play(player, buildArgs(videoNumber), searchResults[videoNumber].title)
+ handleUserInput(videoNumber)
if options["feelingLucky"]:
break