Sunday, January 31, 2016

Simple Webscraper with PhantomJs!

////////////////////////////////////////////////////////// 
/////  PhantomJS URL Scraper v.1.3 ///// 
// 
// Copyrighted by +A.M.Danischewski  2016+ (c)
// This program may be reutilized without limits, provided this 
// notice remain intact. 
// 
// Usage: phantomjs phantom_urls.js <URL> [["class"|"id"] [<query id/class name>]]
//
//   Argument 1: URL -- "https://www.youtube.com/watch?v=8TniRMwL2Vg" 
//   Argument 2: "class" or "id" 
//   Argument 3: If Argument 2 was provided, "class name" or "id name" 
// 
// By default this program will display ALL urls from a user supplied URL.  
// If a class name or id name is provided then only URL's from the class 
// or id are displayed.  
//  
/////////////////////////////////// 

var page = require('webpage').create(), 
    system = require('system'),
    address;

if (system.args.length === 1) {
  console.log(' Usage: phantomjs phantom_urls.js <URL> [["class"|"id"] [<query id/class name>]]');
  phantom.exit();
}

address = system.args[1];
querytype= system.args[2];
queryclass = system.args[3];
page.open(address, function(status) {
  if (status !== 'success') {
    console.log('Error loading address: '+address);
  } else {
   //console.log('Success! In loading address: '+address);   
  }
});

page.onConsoleMessage = function(msg) {
  console.log(msg);
}

page.onLoadFinished = function(status) {
   var dynclass="function() { window.class_urls = new Array(); window.class_urls_next=0; var listings = document.getElementsByClassName('"+queryclass+"'); for (var i=0; i < listings.length; i++) { var el = listings[i]; var ellnks=[].map.call(el.querySelectorAll('a'),function(link) {return link.getAttribute('href');}); var elhtml=el.innerHTML; window.class_urls.push(ellnks.join('\\n')); }; return window.class_urls;}"; 
   var    dynid="function() { window.id_urls = new Array(); window.id_urls_next=0; var listings = document.getElementById('"+queryclass+"'); var ellnks=[].map.call(listings.querySelectorAll('a'),function(link) {return link.getAttribute('href');}); var elhtml=listings.innerHTML; window.id_urls.push(ellnks.join('\\n'));  return window.id_urls;}";  
   var  allurls="function() { var links = page.evaluate(function() { return [].map.call(document.querySelectorAll('a'), function(link) { return link.getAttribute('href'); };); };); console.log(links.join('\\n')); }"; 
   var page_eval_function="";  
   if (querytype === "class") {
   console.log(page.evaluate(dynclass).toString().replace(/,/g, "\n")); 
   } else if (querytype === "id") {
   console.log(page.evaluate(dynid).toString().replace(/,/g, "\n")); 
   } else { 
   var links = page.evaluate(function() {
        return [].map.call(document.querySelectorAll('a'), function(link) {
            return link.getAttribute('href');
        });
    });    
       console.log(links.join('\n'));
   }             
   phantom.exit();
};

Wednesday, January 20, 2016

cp to Multiple Destinations - cpm

alias cpm='_() { src="${1%/}"; shift; printf "\"%s\" " "$@" | xargs -n 1 cp -vR "${src}"; }; _' 

Wednesday, January 6, 2016

To the Clipboard! In Bash

#!/usr/bin/env bash

###     Copyrighted +A.M.Danischewski (c)2016+  
### You may reuse this software without limit provided 
###         this notice remain in tact. 
###
### File: clip.bsh
### Requires: xsel 
###  Description: This script copies something to the clipboard, I 
###  recommend a simple alias, such as: $> alias clip='clip.bsh' 
###  Then you can:    
###     $> echo "hi there" | clip 
###     $> clip myblogpost.html
###     $> clip <<< "little message" 
###  _-=  Enjoy!  _-=
  
declare cliptxt="${1}"
declare rdlnk=$(readlink /proc/$$/fd/0)
declare nl=$(echo -en "\x01") 
if grep -Eq "^pipe:|deleted" <<< "${rdlnk}"; then 
 [[ ! -z "${cliptxt}" ]] && cliptxt=""
 while IFS= read -d $'\n' -r piped_input || break; do cliptxt="${cliptxt}${piped_input}${nl}"; done  
elif [[ -f "${rdlnk}" ]]; then   ## Its a redirected file
 cliptxt=$(< "${rdlnk}") 
elif [[ -e "${cliptxt}" ]]; then ## Its a filename
 cliptxt=$(< "${cliptxt}")       ## File name proper no redirect
else 
 echo " *** Something is wrong, input not read by ${0}." 
fi 
echo -En "${cliptxt}" | tr "${nl}" "\n" | xsel -ib
exit 0 

Bash Sound Fader

#!/usr/bin/env bash 

###     Copyrighted +A.M.Danischewski (c)2016+  
### You may reuse this software without limit provided 
###         this notice remain in tact. 
###
### File: fader.bsh   
###  Description: Simple starter framework for sound manipulation. 
###     $> alias fade='fader.bsh' 
###     $> fade 90 
###  Note: If its broken for some reason, perhaps you have a different 
###  sound card configuration, don't use Alsa/Pulse etc. 
###  To fix it find a way to make the following commands work, and 
###   search and replace them in the code below: 
### 
###   getvol -- The next command should return an integer of the current 
###             volume level:
###    amixer -D pulse sget Master | sed -n "/Left: Playback/p" | \
###            grep -o "\[[0-9]*\%" | sed "s/^.//;s/.\$//" 
### 
###   setvol -- where ${a} is any integer, should set the volume: 
###    amixer -D pulse sset Master ${a}% &>"${DISCARD_DEV}" 
###
###  _-=  Enjoy!  _-=  

declare fade_step=${2:-.05}
declare target_vol=${1}
declare DISCARD_DEV="/dev/random" 

(($#==0)) || [[ "${1}" =~ ^- ]] && usage

function usage() {   
 echo " Usage: fade <target volume> <fade_speed [.05-10]>" 
 exit 0 
} 

function getvol() { 
amixer -D pulse sget Master | sed -n "/Left: Playback/p" | \
          grep -o "\[[0-9]*\%" | sed "s/^.//;s/.\$//"
}

function sanity_checks() { 
((${target_vol}>100)) && target_vol=100 
((${target_vol}<0))   && target_vol=0 
}

function fade() { 
local curr_vol=$(getvol)
for a in $(eval echo {${curr_vol}..${target_vol}}); do 
 amixer -D pulse sset Master ${a}% &>"${DISCARD_DEV}" 
 sleep ${fade_step}
done 
}

function main() { 
sanity_checks
fade &
}

main 
exit 0 

Monday, January 4, 2016

Numbers to Words! In Bash

#!/usr/bin/env bash

###     Copyrighted +A.M.Danischewski (c)2016+  
### You may reuse this software without limit provided 
###         this notice remain in tact. 
### Version: 1.03
### File: num2str.bsh   
###  Description: This script turns numbers into words! 
###     $> num2str.bsh 112975
###        One Hundred Twelve Thousand Nine Hundred Seventy Five
###     $> num2str.bsh 112975 anyflag ## More verbose! 
###        One Hundred Twelve Thousand Nine Hundred Seventy Fifth
###     $> num2str.bsh 1
###        One 
###     $> num2str.bsh 
###        First
###  _-=  Enjoy!  _-=  

declare -a units=("" "one" "two" "three" "four" "five" "six" "seven" \
                  "eight" "nine" "ten" "eleven" "twelve" "thirteen" "fourteen" \
                  "fifteen" "sixteen" "seventeen" "eighteen" "nineteen")            
declare -a tens=("" "" "twenty" "thirty" "forty" "fifty" "sixty" "seventy" "eighty" "ninety")
declare -a unitsverbose=("" "first" "second" "third" "fourth" "fifth" "sixth" \
                         "seventh" "eighth" "ninth" "tenth" "eleventh" "twelfth" "thirteenth" \
                         "fourteenth" "fifteenth" "sixteenth" "seventeenth" "eigteenth" \
                         "nineteenth")
declare numstr="${1}" 
declare rdlnk=$(readlink /proc/$$/fd/0)

if grep -Eq "^pipe:|deleted" <<< "${rdlnk}"; then 
 [[ ! -z "${numstr}" ]] && numstr="" && set -- ourdearflag again
 while IFS= read -r piped_input || break; do numstr="${numstr}${piped_input}"; done  
elif [[ -f "${rdlnk}" ]]; then 
 [[ ! -z "${numstr}" ]] && numstr="" && set -- ourdearflag again
 numstr=$(head -1 "${rdlnk}") ## Only line 14u, you want more than h4ck.
elif [[ -e "${numstr}" ]]; then 
 numstr=$(head -1 "${numstr}") ## File name proper no redirect.
fi 

function main() { 
 local tmpnum=""
 local tmpnumv="" 
 if (($# > 1)); then 
   ## If more than 2 digits, convert only the ((last digit) (if > 0)) or last 2 digits.
  if ((${#numstr} > 2)); then 
   tmpnumv=$(sed 's/^\(.*\)\(..$\)/\2/' <<< "$numstr")
   tmpnum="$(sed 's/..$//' <<< "$numstr")00"
   tmpnum=$(convert ${tmpnum})
   numstr=$((10#${tmpnumv}))
   tmpnumv=$(convert ${tmpnumv} "unitsverbose")
   ((${#numstr} == 2)) && ((${numstr}>19)) && ((${numstr:1:1}==0)) && tmpnumv="$(sed 's/y$//' <<< "${tmpnumv}")ieth"
   numstr="${tmpnum} ${tmpnumv}"
  elif ((${#numstr} == 2)) && ((${numstr}>19)); then 
    numstr="$(sed 's/y$//' <<< $(convert "${numstr}" "unitsverbose"))ieth"
  else ## Convert the whole number to verbose
   numstr=$(convert "$numstr" "unitsverbose")
  fi 
   grep -qEi 'hundred$|thousand$|million$|billion$' <<< "${numstr}" && numstr="${numstr}th"
 else ## Normal conversion 
   numstr=$(convert "$numstr") 
 fi 
  ## Temp, fix for 329478932 and other large numbers that may cause a double space. 
 sed 's/[ ]*$//;s/  / /g' <<< "${numstr}"
} 
   
function convert() {
local -i INTEGER=$((10#${1}))
local unitstype=${2:-"units"} ## units or unitsverbose
 if (($INTEGER < 0)); then 
   echo -en "minus "
   convert $(($INTEGER*-1)) 
elif (($INTEGER < 20)); then 
   eval echo -en \${${unitstype}[$INTEGER]}
elif (($INTEGER < 100)); then 
   echo -en ${tens[$(($INTEGER/10))]}  
   (($INTEGER%10)) && echo -en " "
   eval echo -en \${${unitstype}[$(($INTEGER%10))]}
elif (($INTEGER < 1000)); then 
   eval echo -en "\${${unitstype}[$(($INTEGER/100))]} hundred" 
   (($INTEGER%100)) && echo -en " "
   convert $(($INTEGER%100)) 
elif (($INTEGER < 1000000)); then 
   convert $(($INTEGER/1000))
   echo -en " thousand" 
   (($INTEGER%1000)) && echo -en " "
   convert $(($INTEGER%1000)) 
elif (($INTEGER < 1000000000)); then 
   convert $(($INTEGER/1000000))
   echo -en " million " 
   (($INTEGER%1000)) && echo -en " "
   convert $(($INTEGER%1000000)) 
else 
   convert $(($INTEGER/1000000000))
   echo -en " billion" 
   (($INTEGER%1000000000)) && echo -en " "
   convert $(($INTEGER%1000000000)) 
fi 
} 

main $@ | sed 's/^./\U&/;s/ [^ ]/\U&/g'
exit 0

Sunday, January 3, 2016

Word dılɟ! in Bash

#!/bin/bash

### Copyrighted +A.M.Danischewski (c)2015+  
### You may reuse this software without limit provided this notice 
### remain in tact. 
###
### File: wordflip.bsh  
###  Description: This script turns text upside down! =) 
###  It can accept piped data and redirects,
###     $> wordflip.bsh <<< "some txt" 
###     $> echo -en "flip\nme\n" | wordflip.bsh
###  _-=  Enjoy!  _-=  

declare word=""
declare -A wordlist 
wordlist["a"]="\u0250" 
wordlist["b"]="q" 
wordlist["c"]="\u0254" 
wordlist["d"]="p" 
wordlist["e"]="\u01dd" 
wordlist["f"]="\u025f" 
wordlist["g"]="\u0183"
wordlist["h"]="\u0265"
wordlist["i"]="\u0131"
wordlist["j"]="\u027e"
wordlist["k"]="\u029e"
wordlist["l"]="l"
wordlist["m"]="\u026f"
wordlist["n"]="u"
wordlist["o"]="o"
wordlist["p"]="d"
wordlist["q"]="b"
wordlist["r"]="\u0279"
wordlist["s"]="s"
wordlist["t"]="\u0287"
wordlist["u"]="n"
wordlist["t"]="\u0287"
wordlist["v"]="\u028c"
wordlist["w"]="\u028d"
wordlist["x"]="x"
wordlist["y"]="\u028e"
wordlist["z"]="z"
wordlist["]"]="["
wordlist["["]="]"
wordlist[","]="'"
wordlist["'"]=","
wordlist["("]=")"
wordlist[")"]="("
wordlist["{"]="}"
wordlist["}"]="{"
wordlist["?"]="\u00bf"
wordlist["!"]="\u00a1"
wordlist["\""]=","
wordlist[">"]="<"
wordlist["<"]=">"
wordlist["+"]="+"
wordlist["_"]="\u203e"
wordlist[";"]="\u061b"

 ## Handle piped input and here-string redirects. 
if readlink /proc/$$/fd/0 | grep -Eq "^pipe:|deleted"; then
 word=""
 while IFS= read -r PIPED_INPUT || { DONE=1; }; do 
  PIPED_INPUT=$(sed 's#\\#\\\\#g' <<< "${PIPED_INPUT}")
  word="${word}${PIPED_INPUT}+"
  ((${DONE})) && break; 
 done
else 
 word="${1}" 
fi 

revword=$(echo "$word"|rev) 
for i in $(eval echo "{1..${#revword}}"); do 
 printf "${wordlist[${revword:$((${i}-1)):1}]}"
done | sed 's/^+*//' | tr '+' '\n' 
echo 
exit 0

Boustrophedonify your text!

alias boustrophedon='sed -n "1{p;b a};{/\n/!G;s/\(.\)\(.*\n\)/&\2\1/;//D;s/.//;p};n;p;:a"' 

Friday, January 1, 2016

Ls File Path to Clipboard / via readlink and xsel

alias lsp='_(){ readlink -f "${1}" | tee /dev/stderr | head -1 | xsel -ib; }; _'