]> njoseph.me Git - nimcoon.git/commitdiff
Add interactive arguments to override global ones
authorJoseph Nuthalapati <njoseph@riseup.net>
Sat, 26 Dec 2020 13:32:23 +0000 (19:02 +0530)
committerJoseph Nuthalapati <njoseph@riseup.net>
Sat, 26 Dec 2020 13:32:23 +0000 (19:02 +0530)
Signed-off-by: Joseph Nuthalapati <njoseph@riseup.net>
README.md
src/lib.nim
src/nimcoon.nim

index 03666ee1d704807a19f8fdb771c5f15b81320242..7de80d0e0922d54ce141d88157f8b4c34871d322 100644 (file)
--- a/README.md
+++ b/README.md
@@ -143,16 +143,38 @@ again.
 
 ### 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
index 33b15d933dcde8e8dd2b2675890254b6d5d2a3c1..17761f390339cc8821d62984d4979acf7601ea37 100644 (file)
@@ -145,6 +145,32 @@ proc handleUserInput(searchResult: SearchResult, options: Table[string, bool], p
     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
 
@@ -173,8 +199,14 @@ proc present*(searchResults: SearchResults, options: Table[string, bool], select
   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:
index 45fca1748c1f280e51c19dd5b65f327c4c441035..3ad8fdca67fe4741798a3144acfe3af551b48d7e 100644 (file)
@@ -1,6 +1,5 @@
 import
   parseopt,
-  strformat,
   strutils,
   tables
 
@@ -43,16 +42,6 @@ proc parseArguments(): CommandLineOptions =
   (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()