### Command line arguments
-| **Arguments** | **Explanation** |
-|-------------------|--------------------------------------------|
-| -m, --music | Play Music only, no video |
-| -l, --lucky | Try your luck with the first search result |
-| -f, --full-screen | Play video in full screen |
-| -d, --download | Download video or music |
+NimCoon provides both interactive and non-interactive arguments with significant
+overlap. But some arguments might only be present in one mode.
+
+Non-interactive arguments are specified to the nimcoon program and apply
+globally to all search results in that session. These can be overriden on a
+case-by-case basis using the interactive arguments.
+
+| **Non-interactive Arguments** | **Explanation** |
+|-------------------------------|--------------------------------------------|
+| -m, --music | Play Music only, no video |
+| -l, --lucky | Try your luck with the first search result |
+| -f, --full-screen | Play video in full screen |
+| -d, --download | Download video or music |
Feel free to use these options in any combination. NimCoon will show a helpful
error message if you pick incompatible options.
+Interactive arguments are provided during selection of a search result. These
+options allow you to change your mind after performing the search. For example,
+you might have searched for a music video, watched it and want to download the
+music only. In this case, you can specify the search result followed by the
+options as single characters. i.e
+
+"1" plays the video
+"1 md" downloads the music of the video
+
+| **Interactive Arguments** | **Explanation** |
+|---------------------------|---------------------------|
+| -m, --music | Play Music only, no video |
+| -f, --full-screen | Play video in full screen |
+| -d, --download | Download video or music |
+
## Development
One-liner for compiling and running
play(player, options, searchResult.url, searchResult.title)
+proc isValidOptions*(options: Options): bool =
+ # Check for invalid combinations of options
+ var invalidCombinations = [("musicOnly", "fullScreen"), ("download", "fullScreen")]
+ result = true
+ for combination in invalidCombinations:
+ if options[combination[0]] and options[combination[1]]:
+ stderr.writeLine fmt"Incompatible options provided: {combination[0]} and {combination[1]}"
+ result = false
+
+
+proc updateOptions(options: Options, newOptions: string): Options =
+ result = options
+
+ for option in newOptions:
+ case option
+ of 'm': result["musicOnly"] = true
+ of 'f': result["fullScreen"] = true
+ of 'd': result["download"] = true
+ else:
+ echo "Invalid option provided!"
+ quit(2)
+
+ if(not isValidOptions(result)):
+ quit(2)
+
+
proc present*(searchResults: SearchResults, options: Table[string, bool], selectionRange: SelectionRange, player: string) =
##[ Continuously present options till the user quits the application
of "q":
quit(0)
else:
- let searchResult = searchResults[selectionRange.begin .. selectionRange.until][parseInt(userInput)]
- handleUserInput(searchResult, options, player)
+ if " " in userInput:
+ let selection = parseInt(userInput.split(" ")[0])
+ let updatedOptions = updateOptions(options, userInput.split(" ")[1])
+ let searchResult = searchResults[selectionRange.begin .. selectionRange.until][selection]
+ handleUserInput(searchResult, updatedOptions, player)
+ else:
+ let searchResult = searchResults[selectionRange.begin .. selectionRange.until][parseInt(userInput)]
+ handleUserInput(searchResult, options, player)
if options["feelingLucky"]:
quit(0)
else:
import
parseopt,
- strformat,
strutils,
tables
(searchQuery, options)
-proc isValidOptions*(options: Options): bool =
- # Check for invalid combinations of options
- var invalidCombinations = [("musicOnly", "fullScreen"), ("download", "fullScreen")]
- result = true
- for combination in invalidCombinations:
- if options[combination[0]] and options[combination[1]]:
- stderr.writeLine fmt"Incompatible options provided: {combination[0]} and {combination[1]}"
- result = false
-
-
proc main() =
let
player = selectMediaPlayer()