From 9ed70b9e0ee8ebf8e0b1fc1bbe1b77178d1f008c Mon Sep 17 00:00:00 2001 From: Joseph Nuthalapati Date: Sat, 26 Dec 2020 19:02:23 +0530 Subject: [PATCH] Add interactive arguments to override global ones Signed-off-by: Joseph Nuthalapati --- README.md | 34 ++++++++++++++++++++++++++++------ src/lib.nim | 36 ++++++++++++++++++++++++++++++++++-- src/nimcoon.nim | 11 ----------- 3 files changed, 62 insertions(+), 19 deletions(-) diff --git a/README.md b/README.md index 03666ee..7de80d0 100644 --- 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 diff --git a/src/lib.nim b/src/lib.nim index 33b15d9..17761f3 100644 --- a/src/lib.nim +++ b/src/lib.nim @@ -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: diff --git a/src/nimcoon.nim b/src/nimcoon.nim index 45fca17..3ad8fdc 100644 --- a/src/nimcoon.nim +++ b/src/nimcoon.nim @@ -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() -- 2.43.0