diff --git a/bash/.alias.sh b/bash/.alias.sh index c358d2a..b24aa6c 100644 --- a/bash/.alias.sh +++ b/bash/.alias.sh @@ -3,7 +3,7 @@ alias phpserver='docker run --rm -p 2000:80 -v "$PWD":/var/www/html mastermindzh alias nodeserver='docker run --rm -p 3000:3000 -v "$PWD":/app mastermindzh/generic_node' alias reactserver='docker run --rm -p 8080:8080 -v "$PWD":/app mastermindzh/generic_node' alias mongoserver='docker run -d --rm -p 27017:27017 --name mongo-server -e MONGO_INITDB_ROOT_USERNAME=admin -e MONGO_INITDB_ROOT_PASSWORD=123 -v ~/.db/mongo:/data/db mongo' -alias sqlserver='docker run -d --rm -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourPassword123" -p 1433:1433 -v ~/.db/mssql:/var/opt/mssql microsoft/mssql-server-linux' +alias sqlserver='docker run -d --rm --name sql-server -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=YourPassword123" -p 1433:1433 -v ~/.db/mssql:/var/opt/mssql microsoft/mssql-server-linux' # useful docker commands alias stop-dockers='docker stop $(docker ps -aq)' @@ -40,6 +40,7 @@ alias dotnetnew="dotnet new webapi -o " alias nmapscan='nmap -n -sP' alias pia='nohup sh /opt/pia/run.sh &>/dev/null & disown' alias wifimenu='nm-connection-editor' +alias mountrick='sudo mount -t cifs //192.168.1.2/Rick /mnt/rick/ -o username=mastermindzh,noexec' # show file content without comment lines alias nocomment='grep -Ev '\''^(#|$)'\''' diff --git a/dependencies/aur.txt b/dependencies/aur.txt index 3ffcbee..aadbc95 100644 --- a/dependencies/aur.txt +++ b/dependencies/aur.txt @@ -9,4 +9,5 @@ awesome-terminal-fonts-git otf-droid-sans-mono-powerline-git downgrade dive - +xorg-xev +spotify diff --git a/dependencies/pacman.txt b/dependencies/pacman.txt index c507ef9..adf3563 100644 --- a/dependencies/pacman.txt +++ b/dependencies/pacman.txt @@ -63,3 +63,5 @@ xvidcore gvfs-smb gnome-screenshot bash-completion +flameshot +otf-font-awesome diff --git a/i3/config b/i3/config index ecb8c2d..a9a4306 100644 --- a/i3/config +++ b/i3/config @@ -38,6 +38,9 @@ set $workspace10 "10:  " set $workspace11 " Virtualbox" set $workspace12 " Enpass" +# scripts +set $spotify ~/.config/i3/scripts/spotify-cli.sh + ############################################ # i3 management keys # ############################################ @@ -116,8 +119,8 @@ bindsym $mod+shift+l exec /bin/bash ~/.config/i3/scripts/suspend.sh ############################################ bindsym $mod+Return exec xfce4-terminal # terminal bindsym $mod+e exec nautilus # File manager -bindsym Print exec gnome-screenshot # Fullscreen screenshot -bindsym $mod+Print exec /bin/bash ~/.config/i3/scripts/screenshot.sh # Show screenshot window +bindsym Print exec flameshot screen -d 0 -p ~/Pictures/Screenshots # Fullscreen screenshot +bindsym $mod+Print exec flameshot gui # Show screenshot window bindsym $mod+shift+b exec /bin/bash ~/.config/i3/scripts/brightness.sh # Rofi @@ -144,6 +147,9 @@ bindsym XF86AudioPlay exec playerctl play bindsym XF86AudioPause exec playerctl pause bindsym XF86AudioNext exec playerctl next bindsym XF86AudioPrev exec playerctl previous +bindsym $mod+Next exec $spotify next +bindsym $mod+End exec $spotify prev +bindsym $mod+Delete exec $spotify play ############################################ # Workspaces # diff --git a/i3/i3blocks.conf b/i3/i3blocks.conf index 1147f5a..45ada48 100644 --- a/i3/i3blocks.conf +++ b/i3/i3blocks.conf @@ -29,12 +29,19 @@ separator_block_width=15 markup=none # Currently playing song -[music] +[play_music] command=python ~/.config/i3/scripts/blocks/currentSong.py --layout t-A separator_block_width=13 interval=1 color=#e29e0b +[spotify] +command=bash ~/.config/i3/scripts/blocks/spotify.sh +separator_block_width=13 +interval=1 +color=#1DB954 + + # Temperature # # Support multiple chips, though lm-sensors. diff --git a/i3/scripts/blocks/spotify.sh b/i3/scripts/blocks/spotify.sh new file mode 100755 index 0000000..f27d401 --- /dev/null +++ b/i3/scripts/blocks/spotify.sh @@ -0,0 +1,14 @@ +#!/bin/bash + +case $BLOCK_BUTTON in + 1) ~/.config/i3/scripts/spotify-cli.sh play ;; # left click + 4) ~/.config/i3/scripts/spotify-cli.sh next ;; # scroll up + 5) ~/.config/i3/scripts/spotify-cli.sh prev ;; # scroll down +esac + +if ~/.config/i3/scripts/spotify-cli.sh status | grep 'Paused' > /dev/null; then + printf ' ' # fa-pause +else + printf ' ' # fa-play +fi +~/.config/i3/scripts/spotify-cli.sh current-oneline \ No newline at end of file diff --git a/i3/scripts/spotify-cli.sh b/i3/scripts/spotify-cli.sh new file mode 100755 index 0000000..e47639c --- /dev/null +++ b/i3/scripts/spotify-cli.sh @@ -0,0 +1,276 @@ +#!/bin/bash + +# CONSTANTS + +SP_VERSION="0.1" +SP_DEST="org.mpris.MediaPlayer2.spotify" +SP_PATH="/org/mpris/MediaPlayer2" +SP_MEMB="org.mpris.MediaPlayer2.Player" + +# To get SP_ID and SP_SECRET register at +# https://beta.developer.spotify.com/documentation/general/guides/app-settings/ +SP_ID="" +SP_SECRET="" + +# SHELL OPTIONS + +shopt -s expand_aliases +SP_B64ID=$(echo -n "$SP_ID:$SP_SECRET"|base64) +SP_B64ID=$(echo $SP_B64ID | sed 's/ //g') + +# UTILITY FUNCTIONS + +function require { + hash $1 2>/dev/null || { + echo >&2 "Error: '$1' is required, but was not found."; exit 1; + } +} + +# COMMON REQUIRED BINARIES + +# We need dbus-send to talk to Spotify. +require dbus-send + +# Assert standard Unix utilities are available. +require grep +require sed +require cut +require tr + +# 'SPECIAL' (NON-DBUS-ALIAS) COMMANDS + +function sp-dbus { + # Sends the given method to Spotify over dbus. + dbus-send --print-reply --dest=$SP_DEST $SP_PATH $SP_MEMB.$1 ${*:2} > /dev/null +} + +function sp-open { + # Opens the given spotify: URI in Spotify. + sp-dbus OpenUri string:$1 +} + +function sp-metadata { + # Prints the currently playing track in a parseable format. + + dbus-send \ + --print-reply `# We need the reply.` \ + --dest=$SP_DEST \ + $SP_PATH \ + org.freedesktop.DBus.Properties.Get \ + string:"$SP_MEMB" string:'Metadata' \ + | grep -Ev "^method" `# Ignore the first line.` \ + | grep -Eo '("(.*)")|(\b[0-9][a-zA-Z0-9.]*\b)' `# Filter interesting fiels.`\ + | sed -E '2~2 a|' `# Mark odd fields.` \ + | tr -d '\n' `# Remove all newlines.` \ + | sed -E 's/\|/\n/g' `# Restore newlines.` \ + | sed -E 's/(xesam:)|(mpris:)//' `# Remove ns prefixes.` \ + | sed -E 's/^"//' `# Strip leading...` \ + | sed -E 's/"$//' `# ...and trailing quotes.` \ + | sed -E 's/"+/|/' `# Regard "" as seperator.` \ + | sed -E 's/ +/ /g' `# Merge consecutive spaces.` +} + +function sp-current { + # Prints the currently playing track in a friendly format. + require column + + sp-metadata \ + | grep --color=never -E "(title)|(album)|(artist)" \ + | sed 's/^\(.\)/\U\1/' \ + | column -t -s'|' +} + +function sp-current-oneline { + sp-metadata | grep -E "(title|artist)" | sed 's/^\(.\)*|//' | sed ':a;N;$!ba;s/\n/ - /g' +} + +function sp-status { + dbus-send \ + --print-reply \ + --dest=$SP_DEST \ + $SP_PATH \ + org.freedesktop.DBus.Properties.Get \ + string:"$SP_MEMB" string:'PlaybackStatus' \ + | tail -1 \ + | cut -d "\"" -f2 +} + +function sp-eval { + # Prints the currently playing track as shell variables, ready to be eval'ed + require sort + + sp-metadata \ + | grep --color=never -E "(title)|(album)|(artist)|(trackid)|(trackNumber)" \ + | sort -r \ + | sed 's/^\([^|]*\)\|/\U\1/' \ + | sed -E 's/\|/="/' \ + | sed -E 's/$/"/' \ + | sed -E 's/^/SPOTIFY_/' +} + +function sp-art { + # Prints the artUrl. + + sp-metadata | grep "artUrl" | cut -d'|' -f2 +} + +function sp-display { + # Calls display on the artUrl. + + require display + display $(sp-art) +} + +function sp-feh { + # Calls feh on the artURl. + + require feh + feh $(sp-art) +} + +function sp-url { + # Prints the HTTP url. + + TRACK=$(sp-metadata | grep "url" | cut -d'|' -f2 | cut -d':' -f3) + echo "http://open.spotify.com/track/$TRACK" +} + +function sp-clip { + # Copies the HTTP url. + + require xclip + sp-url | xclip +} + +function sp-http { + # xdg-opens the HTTP url. + + require xdg-open + xdg-open $(sp-url) +} + +function sp-help { + # Prints usage information. + + echo "Usage: sp [command]" + echo "Control a running Spotify instance from the command line." + echo "" + echo " sp play - Play/pause Spotify" + echo " sp pause - Pause Spotify" + echo " sp next - Go to next track" + echo " sp prev - Go to previous track" + echo "" + echo " sp current - Format the currently playing track" + echo " sp metadata - Dump the current track's metadata" + echo " sp eval - Return the metadata as a shell script" + echo "" + echo " sp art - Print the URL to the current track's album artwork" + echo " sp display - Display the current album artwork with \`display\`" + echo " sp feh - Display the current album artwork with \`feh\`" + echo "" + echo " sp url - Print the HTTP URL for the currently playing track" + echo " sp clip - Copy the HTTP URL to the X clipboard" + echo " sp http - Open the HTTP URL in a web browser" + echo "" + echo " sp open - Open a spotify: uri" + echo " sp search - Start playing the best search result for the given query" + echo "" + echo " sp version - Show version information" + echo " sp help - Show this information" + echo "" + echo "Any other argument will start a search (i.e. 'sp foo' will search for foo)." +} + +function sp-search { + # Searches for tracks, plays the first result. + + require curl + #send request for token with ID and SecretID encoded to base64->grep take only token from reply->trim reply down to token-> modified request to include token in header + Q="$@" + ST=$(curl -H "Authorization: Basic $SP_B64ID" -d grant_type=client_credentials https://accounts.spotify.com/api/token --silent \ + | grep -E -o "access_token\":\"[a-zA-Z0-9_-]+\"" -m 1 ) + + echo $Q + + ST2=${ST:15:86}} + SPTFY_URI=$( \ + curl -H "Authorization: Bearer $ST2" -s -G --data-urlencode "q=$Q" --data type=artist,track https://api.spotify.com/v1/search/ \ + | grep -E -o "spotify:track:[a-zA-Z0-9]+" -m 1 \ + ) + + sp-open $SPTFY_URI +} + +function sp-version { + # Prints version information. + + echo "sp $SP_VERSION" + echo "Copyright (C) 2013 Wander Nauta" + echo "License MIT" +} + +# 'SIMPLE' (DBUS-ALIAS) COMMANDS + +alias sp-play=" sp-dbus PlayPause" +alias sp-pause=" sp-dbus Pause" +alias sp-next=" sp-dbus Next" +alias sp-prev=" sp-dbus Previous" + +# DISPATCHER + +# First, we connect to the dbus session spotify is on. This isn't really needed +# when running locally, but is crucial when we don't have an X display handy +# (for instance, when running sp over ssh.) + +SPOTIFY_PID="$(pidof -s spotify)" + +if [[ -z "$SPOTIFY_PID" ]]; then + echo "Error: Spotify is not running." + exit 1 +fi + +QUERY_ENVIRON="$(cat /proc/${SPOTIFY_PID}/environ | tr '\0' '\n' | grep "DBUS_SESSION_BUS_ADDRESS" | cut -d "=" -f 2-)" +if [[ "${QUERY_ENVIRON}" != "" ]]; then + export DBUS_SESSION_BUS_ADDRESS="${QUERY_ENVIRON}" +fi + +# Then we dispatch the command. + +subcommand="$1" + +if [[ -z "$subcommand" ]]; then + # No arguments given, print help. + sp-help +else + # Arguments given, check if it's a command. + if $(type sp-$subcommand > /dev/null 2> /dev/null); then + # It is. Run it. + shift + eval "sp-$subcommand $@" + else + # It's not. Try a search. + eval "sp-search $@" + fi +fi + + +# Copyright (C) 2013 Wander Nauta +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software, to deal in the Software without restriction, including +# without limitation the rights to use, copy, modify, merge, publish, +# distribute, sublicense, and/or sell copies of the Software, and to permit +# persons to whom the Software is furnished to do so, subject to the following +# conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# The software is provided "as is", without warranty of any kind, express or +# implied, including but not limited to the warranties of merchantability, +# fitness for a particular purpose and noninfringement. In no event shall the +# authors or copyright holders be liable for any claim, damages or other +# liability, whether in an action of contract, tort or otherwise, arising from, +# out of or in connection with the software or the use or other dealings in the +# software. +# \ No newline at end of file