/gcli-scala

A Command Line Search Client for Google

Primary LanguageScalaMIT LicenseMIT

gcli-scala

Command Line Search Client for Google

Build Status

What
–––

Gcli aims to bring otherwise hard-to-reach Google search filters to the command line. I am frequently only interested in finding current content. Google provides the time-based search filters, but AFAIK only through the UI.

Current state of affairs:

▶ gcli --help
gcli 0.0.1
Usage: gcli [options] <query terms>...

  --help
        prints this usage text
  <query terms>...
        search query
  -q <value> | --quick <value>
        quick options: last y(ear) | m(onth) | d(ay) | w(eek) | h(hour)
  --yfrom <value>
        search for content more recent than --yfrom (accepts 2-digit and 4-digit numbers)
  --yto <value>
        search for content older --yto (accepts 2-digit and 4-digit numbers)
  --site <value>
        specify a domain that this search should be limited to, e.g. docs.djangoproject.com
  --so
        limit search results to stackoverflow.com
  --images
        use Google's image search
  --news
        use Google's news search
  --videos
        use Google's video search
  --noconf
        don't look for configuration files on disk and don't prompt to create them
  --noop
        run program but don't open the browser

From within SBT: (--noop prevents actually opening the browser)

> run -q:y I really need to find this                            # last year
Searching for: I really need to find this
noop: would run open https://www.google.com/?#q=I+really+need+to+find+this&tbs=qdr:y

> run -q:m I really need to find this                            # last month
Searching for: I really need to find this
noop: would run open https://www.google.com/?#q=I+really+need+to+find+this&tbs=qdr:m

> run --yfrom:2013 and now for something different               # later than 2013
Searching for: and now for something different
noop: would run open https://www.google.com/?#q=and+now+for+something+different&tbs=cdr:1,cd_min:2013,cd_max:

> run --yto:2013 and now for something different                 # older than 2013
Searching for: and now for something different
noop: would run open https://www.google.com/?#q=and+now+for+something+different&tbs=cdr:1,cd_min:,cd_max:2013

> run --yfrom:2010 --yto:2013 and now for something different    # between 2010 and 2013
Searching for: and now for something different
noop: would run open https://www.google.com/?#q=and+now+for+something+different&tbs=cdr:1,cd_min:2010,cd_max:2013

> run --so -q:y howto iterate collection java                    # last year, limit to stackoverflow.com
Searching for: howto iterate collection java
NOOP: would run open https://www.google.com/?#q=site:stackoverflow.com+howto+iterate+collection+java&tbs=qdr:y

> run --site theguardian.com --yfrom:2014 --yto:2014 world cup   # results from 2014 on theguardian.com
Searching for: world cup                                          
NOOP: would run open https://www.google.com/?#q=site:www.theguardian.com+world+cup&tbs=cdr:1,cd_min:2014,cd_max:2014

Configuration
–––

WIP When you run the command, you will be prompted for approval to create a .gcli directory at your home dir. If you approve a config.json will be saved in that directory. There is currently no nice api to write the config file, but you could open it up in your editor and modify these settings:

# vi ~/.gcli/config.json
startCommand ... the command that will be invoked in your shell to open the browser (default: open)
tld ............ the Google top-level domain to use for your search (default: com)

open works on Mac OS X, but you could change it for example to invoke open -a firefox or something similar. On other platforms another command might be needed, e.g. xdg-open on Linux.

The reason for making .gcli a directory rather than a dot-file is that this directory will also be the storage location for search profiles and other user settings in the future.

In a future version the path itself will become configurable, so that it gets possible to store these files in Dropbox, Livedrive, etc.

Caution the startCommand is currently executed as is, so if someone tries to do some sudo rm -Rfv / && open in that setting that might become a sad moment.

Running from CLI
–––

Executing by typing $ java -jar ... is cumbersome. On Unix/Linux it is easy to get around with either an alias or a shell script. An alias in a dot-file like .bashrc might look like.

alias gcli='java -jar /path/to/gcli-scala.jar'

More interesting stuff (that might be added)
–––

  • Provide feature to save search presets (i.e. --preset:foo)
  • Make default search settings customizable (behavior /wo any options)
  • Make UI for interactive mode (-i)
  • Show search results on command line?

Dependencies
–––

Motivation
–––

This is a fun and educational project to get to know the world of Scala. Nevertheless it may become a useful utility in a developer's toolbox.

License
––

MIT