diff options
-rw-r--r-- | Makefile | 10 | ||||
-rw-r--r-- | aur/clerk_fzf-git/.SRCINFO | 20 | ||||
-rw-r--r-- | aur/clerk_fzf-git/PKGBUILD | 29 | ||||
-rw-r--r-- | aur/clerk_fzf-git/clerk-git.install | 8 | ||||
-rw-r--r-- | aur/clerk_fzf-git/clerk_fzf-git.install | 8 | ||||
-rwxr-xr-x | clerk | 2127 | ||||
-rw-r--r-- | clerk.pl | 199 | ||||
-rw-r--r-- | clerk_fzf/Makefile | 9 | ||||
-rwxr-xr-x | clerk_fzf/clerk_fzf | 381 | ||||
-rw-r--r-- | clerk_fzf/clerk_fzf.conf | 35 | ||||
-rw-r--r-- | clerk_fzf/tmux.clerk | 54 | ||||
-rwxr-xr-x | clerk_helper | 366 | ||||
-rw-r--r-- | completion/_clerk | 112 | ||||
-rw-r--r-- | config.clerk | 84 |
14 files changed, 199 insertions, 3243 deletions
diff --git a/Makefile b/Makefile deleted file mode 100644 index f721c8d..0000000 --- a/Makefile +++ /dev/null @@ -1,10 +0,0 @@ -ifndef PREFIX - PREFIX=/usr/local -endif - -install: - install -Dm755 clerk $(DESTDIR)$(PREFIX)/bin/clerk - install -Dm755 clerk_helper $(DESTDIR)$(PREFIX)/bin/clerk_helper - install -Dm644 config.clerk $(DESTDIR)$(PREFIX)/share/doc/clerk/config.example - install -Dm644 config.clerk $(DESTDIR)/etc/clerk.conf - install -Dm644 README.md $(DESTDIR)$(PREFIX)/share/doc/clerk/README.md diff --git a/aur/clerk_fzf-git/.SRCINFO b/aur/clerk_fzf-git/.SRCINFO deleted file mode 100644 index 881b9f4..0000000 --- a/aur/clerk_fzf-git/.SRCINFO +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by mksrcinfo v8 -# Thu Jul 21 11:14:48 UTC 2016 -pkgbase = clerk_fzf-git - pkgdesc = clerk - mpd client for rofi - pkgver = 799.7cac52d - pkgrel = 1 - url = https://github.com/carnager/clerk - arch = any - license = GPL - makedepends = git - depends = tmux - depends = mpc - depends = fzf - depends = util-linux - optdepends = sl: fancy update animation - source = git+https://git.53280.de/clerk - md5sums = SKIP - -pkgname = clerk_fzf-git - diff --git a/aur/clerk_fzf-git/PKGBUILD b/aur/clerk_fzf-git/PKGBUILD deleted file mode 100644 index a48d350..0000000 --- a/aur/clerk_fzf-git/PKGBUILD +++ /dev/null @@ -1,29 +0,0 @@ -# Maintainer: Rasmus Steinke <rasi at xssn dot at> -# Contributor: Christian Rebischke - -pkgname=clerk_fzf-git -pkgver=799.7cac52d -pkgrel=1 -pkgdesc="clerk - mpd client for rofi" -arch=('any') -url='https://github.com/carnager/clerk' -license=('GPL') -depends=('tmux' 'mpc' 'fzf' 'util-linux') -optdepends=('sl: fancy update animation') -makedepends=('git') -source=('git+https://git.53280.de/clerk') - -pkgver() { - cd clerk - printf "%s.%s" "$(git rev-list --count HEAD)" "$(git rev-parse --short HEAD)" -} - -package() { - cd clerk/clerk_fzf - ls - make DESTDIR="$pkgdir/" \ - PREFIX='/usr' \ - install -} - -md5sums=('SKIP') diff --git a/aur/clerk_fzf-git/clerk-git.install b/aur/clerk_fzf-git/clerk-git.install deleted file mode 100644 index 3f40820..0000000 --- a/aur/clerk_fzf-git/clerk-git.install +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -post_install() { -echo ' -Copy /etc/clerk_fzf.conf to $HOME/.config/clerk/clerk_fzf.conf -To initialize cache files, run "clerk_update --create-caches". clerk_fzf is started with clerk_starter. -' -} -#post_install diff --git a/aur/clerk_fzf-git/clerk_fzf-git.install b/aur/clerk_fzf-git/clerk_fzf-git.install deleted file mode 100644 index 7f4b1ef..0000000 --- a/aur/clerk_fzf-git/clerk_fzf-git.install +++ /dev/null @@ -1,8 +0,0 @@ -#!/bin/bash -post_install() { -echo ' -to use clerk you need to copy /usr/share/doc/clerk/config.example to $HOME/.config/clerk/config -and edit it to your needs. -' -} -#post_install @@ -1,2127 +0,0 @@ -#!/usr/bin/env bash - -shopt -s globstar - - -# load default settings -# custom rofi settings (rofi reads settings from ~/.Xresources) -# but you can override settings here. -_rofi () { - rofi -i -lines 30 -width 1500 -no-levenshtein-sort "$@" - } - -# custom mpd host -mpd_host= -mpd_port= -mpd_password= - -# Number of Songs to be added for "Random Tracks" -value=20 - -# stop on suspend? -stop_after_suspend=no - -# use artist or albumartist for random tracks -random_artist=artist - -# scrobbler to use. possible values: mpdscribble, mpdas -scrobbler=mpdscribble - -# Fill these if scrobbler runs on a different host -# set to 0 if mpdscribble runs locally -ssh_lastfm=0 -ssh_host= - -# color of the help messages -help_color="#0C73C2" -help_separator_color="#5F5F5F" - -# custom keybindings -# global -albumlist="Alt+F1" -tracklist="Alt+F2" -queue="Alt+F3" -toggle="Alt+F6" -prev="Alt+F5" -next="Alt+F8" -stop="Alt+F7" -seek="Alt+f" -nextalbum="Alt+Shift+F5" -prevalbum="Alt+Shift+F8" - -# Adding of songs/albums -add="Alt+1" -insert="Alt+2" -replace="Alt+3" -rate="Alt+r" -addplay="Alt+4" -insertplay="Alt+5" -savefav="Alt+s" - -# playlist menu -# also used: rate -delete="Alt+Delete" -crop="Alt+x" -clear="Alt+c" -movedown="Alt+Down" -moveup="Alt+Up" -goalbum="Alt+a" -gotrack="Alt+t" -chplaylist="Alt+p" - -# table customization -track_width="2" -title_width="40" -artist_width="40" -date_width="6" -# album is much longer in order to keep filename off screen -album_width="200" - -# custom widths for playlist -pl_title_width="60" -pl_artist_width="40" - -# XDG base directory Specification -xdg_config="${XDG_CONFIG_HOME:-$HOME/.config}" -xdg_data="${XDG_DATA_HOME:-$HOME/.local/share}" - -# base clerk directories -config_root="${xdg_config}/clerk" -data_root="${xdg_data}/clerk" - -# clerk files -config_rc="${config_root}/config" -podcast_list="${config_root}/podcasts" -cache_album="${data_root}/albums.cache" -cache_track="${data_root}/tracks.cache" -cache_latest="${data_root}/latest.cache" -last_update="${data_root}/.lastupdate" -suspend_state="${data_root}/suspend" -last_track_rate_bak="${data_root}/.last_trackratings_backup" -db_rate_track="${data_root}/trackratings.json" -db_rate_album="${data_root}/albumratings.json" - -# set clerk_helper environment variable by making the herebelow variables -# available to subprocceses (i.e. clerk_helper) -export cache_album -export cache_track -export db_rate_album -export db_rate_track - -# make sure the xdg user data directory for clerk exists -mkdir -p "$data_root" - -# override settings from global config file, if present -if [[ ! -f $config_rc ]] && [[ ! -f /etc/clerk ]]; then - echo "Error: could not find configuration file \"$config_rc\"" - echo "You can use the provided example configuration file (config.clerk), copy it to the above location and edit it to your needs." - exit -fi - -if [[ -f /etc/clerk.conf ]]; then - source /etc/clerk.conf -fi - -# override settings from local config, if present -if [[ -f $config_rc ]]; then - source $config_rc -fi - -if [[ -n $mpd_host ]]; then - if [[ -n $mpd_password ]]; then - export MPD_HOST="${mpd_password}@${mpd_host}" - else - export MPD_HOST="${mpd_host}" - fi -fi - -if [[ -n $mpd_port ]]; then - export MPD_PORT="${mpd_port}" -fi - -# check for scrobbler -if [[ $scrobbler == mpdas ]]; then - export scrobbler="mpdas -d" - export scrobbler_kill="mpdas" -elif [[ $scrobbler == mpdscribble ]]; then - export scrobbler_kill="mpdscribble" -fi - -# set help color -if [[ $help_color == "" ]]; then - help_color=$(rofi -dump-xresources | grep -P '^rofi.color.normal' | awk -F ',' '{ print $2 }' | xargs) - help_separator_color=$(rofi -dump-xresources | grep -P 'rofi.color.normal' | awk -F ',' '{ print $2 }' | xargs) -fi - -fix_date_format() { - # provided by Thorsten Wißmann: - # https://github.com/t-wissmann/dotfiles/blob/master/menu/rofi-mpd.sh - # reformats the date given in column $1 from format %c of locale LC_TIME=C - # (see man strftime) to the format specified in argument $2 column indices - # start with 1 - column_index="$1" - gawk -F $'\t' ' - # parse a date which was formated using %c to unix time - BEGIN { - # generated by the following bash one-liner: - # for i in {1..12} ; do LC_TIME=C date -d "1972-$i-01" +month2num[\"%b\"]\ =\ %_m ; done - month2num["Jan"] = 1 - month2num["Feb"] = 2 - month2num["Mar"] = 3 - month2num["Apr"] = 4 - month2num["May"] = 5 - month2num["Jun"] = 6 - month2num["Jul"] = 7 - month2num["Aug"] = 8 - month2num["Sep"] = 9 - month2num["Oct"] = 10 - month2num["Nov"] = 11 - month2num["Dec"] = 12 - } - function reformat_c_date(str) { - monthname = gensub(/^([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)$/, "\\2", "g", str) - monthnum = month2num[monthname] - nicedate = gensub(/^([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)$/, "\\5 " monthnum " \\3 \\4", "g", str) - nicedate = gensub(/:/, " ", "g", nicedate) - return nicedate - } - { - # modify the $column_index-th field - $'"$1"' = strftime("'"$2"'", mktime(reformat_c_date($'"$1"'))) - print $0 - } - ' -} - - -updateCache () { - notify-send "clerk" "updating cache files" - cd $data_root - rm -f *.cache - - mpc --format '%mtime%\t[%albumartist%|%artist%] ○ (%date%) ○ %album% [(CD %disc%)] ○ %file%' \ - search filename '' \ - | fix_date_format 1 '%Y-%m-%d-%H:%M:%S' \ - | sort -nr \ - | gawk '{for (i=2; i<NF; i++) printf $i " "; print $NF }' \ - | perl -ne 'print unless $seen{$_}++' \ - | sed 's:/[^/]*$::' | awk -F ' ○ ' '!seen[$1 $2 $3 $4]++' \ - | uniq \ - | gawk -F ' ○ ' '{ printf "%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.300s\n", $1, $2, $3, $4 }' \ - > $cache_latest - mpc --format '[%albumartist%|%artist%]\t(%date%)\t%album% [(CD %disc%)]\t%file%' \ - search filename '' \ - | sed 's:/[^/]*$::' \ - | awk -F '\t' '!seen[$1 $2 $3 $4]++' \ - | sort \ - | gawk -F '\t' '{ printf "%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.300s\n", $1, $2, $3, $4 }' \ - > $cache_album - mpc --format '%track%\t%title%\t%artist%\t(%date%)\t%album%\t%file%' \ - search filename '' \ - | gawk -F '\t' '{ printf "%-"'${track_width}'"."'${track_width}'"s\t%-"'${title_width}'"."'${title_width}'"s\t%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.500s\n", $1, $2, $3, $4, $5, $6 }' \ - > $cache_track - notify-send "clerk" "finished updating cache files" - date=$(mpc stats | grep 'DB Updated: ') - file="$last_update" - echo "${date}" > "${file}" -# | gawk -F '\t' '{ printf "%.2s\t%.40s\t%.40s\t%.200s\t%.500s\n", $1, $2, $3, $4, $5, $6 }' \ - if [[ $forceupdate == "true" ]]; then - exit - fi -} -if [[ $1 == "--update" ]]; then - : -else - date=$(mpc stats | grep 'DB Updated: ') - file="$last_update" - if [ "$(< $file)" = "$date" ] && [ -f "$file" ] ; then - : - else - updateCache - date=$(mpc stats | grep 'DB Updated: ') - echo "${date}" > "${file}" - fi -fi - -# Use GNU coreutils on OSX -sed=$([[ "$OSTYPE" == "darwin"* ]] && echo 'gsed' || echo 'sed') -shuf=$([[ "$OSTYPE" == "darwin"* ]] && echo 'gshuf' || echo 'shuf') -tac=$([[ "$OSTYPE" == "darwin"* ]] && echo 'gtac' || echo 'tac') - - -# main Menu -dplayPrompt () { - if [[ -z $(mpc status | grep "/") ]]; then - song="No Song is playing" - else - song=$(mpc current) - fi - menu=$(echo -e "< Exit\n---\n1 [ Browse Library ]>\n2 [ Current Artist ]>\n3 [ Current Queue ]>\n---\n4 [ Options ]>\n5 [ Ratings ]>\n6 [ Help ]" \ - | _rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -lines 17 \ - -mesg "<span color='$help_color'>Currently Playing: ${song}</span>" \ - -auto-select \ - -kb-custom-1 ${prev} \ - -kb-custom-2 ${toggle} \ - -kb-custom-3 ${stop} \ - -kb-custom-4 ${next} \ - -kb-custom-5 ${albumlist} \ - -kb-custom-6 ${tracklist} \ - -kb-custom-7 ${queue} \ - -kb-custom-8 ${seek} \ - -kb-custom-9 ${nextalbum} \ - -kb-custom-10 ${prevalbum} \ - -p "clerk > ") - - val=$? - - if [[ $val -eq 1 ]]; then - exit - elif [[ $val -eq 10 ]]; then - mpc prev - dplayPrompt - elif [[ $val -eq 11 ]]; then - mpc toggle - dplayPrompt - elif [[ $val -eq 12 ]]; then - mpc stop - dplayPrompt - elif [[ $val -eq 13 ]]; then - mpc next - dplayPrompt - elif [[ $val -eq 14 ]]; then - addAlbum alphabet - elif [[ $val -eq 15 ]]; then - addTrackTags - elif [[ $val -eq 16 ]]; then - dplayQueue - elif [[ $val -eq 17 ]]; then - seekMenu - elif [[ $val -eq 18 ]]; then - skipAlbum next - unset IFS - dplayPrompt - elif [[ $val -eq 19 ]]; then - skipAlbum prev - unset IFS - dplayPrompt - fi - - if [[ "$menu" == "< Exit" ]]; then - exit - elif [[ "$menu" == "2 "* ]]; then - currentMenu - elif [[ "$menu" == "3 "* ]]; then - dplayQueue - elif [[ "$menu" == "1 "* ]]; then - browseLibPrompt - elif [[ "$menu" == "4 "* ]]; then - dplayOptionsPrompt - elif [[ "$menu" == "5 "* ]]; then - ratingPrompt - elif [[ "$menu" == "6 "* ]]; then - helpMenu - elif [[ -z "$menu" ]]; then - exit - fi - -} - -helpMenu () { - showhelp=$(echo -e "< Return\n \ ----\n \ -# Global\n \ -Album List: "${albumlist}"\n \ -Track List: "$tracklist"\n \ -Queue: "$queue"\n \ -Toggle Playback "$toggle"\n \ -Previous: "$prev"\n \ -Previous Album: "$prevalbum"\n \ -Next: "$next"\n \ -Next Album: "$nextalbum"\n \ -Stop: "$stop"\n \ -Seek: "$seek"\n \ -\n \ -# Adding of Songs/Albums\n \ -Add: "$add"\n \ -Insert: "$insert"\n \ -Replace: "$replace"\n \ -Rate: "$rate"\n \ -Add & Play: "$addplay"\n \ -Insert & Play: "$insertplay"\n \ -Save to Favs: "$savefav"\n \ -\n \ -# Playlist Menu\n \ -Delete selected "$delete"\n \ -Crop Playlist: "$crop"\n \ -Clear Playlist: "$clear"\n \ -Move Down: "$movedown"\n \ -Move Up: "$moveup"\n \ -Go to Album: "$goalbum"\n \ -Go to Track: "$gotrack"\n \ -Load/Save: "$playlist"" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Hotkeys > ") - - val=$? - - if [[ $val -eq 1 ]]; then - exit - fi - - if [[ $showhelp == "< Return" ]]; then - dplayPrompt - else - helpMenu - fi - -} - - -seekMenu () { - seekval="$((echo -e "< Return\n---\n$(for i in $(seq 0 10 100); do echo "${i}%"; done)") \ - | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu \ - -p "Seek > ")" - - if [[ $seekval == *"%" ]]; then - mpc seek "${seekval}" - unset seekval - $* - elif [[ $seekval == "< Return" ]]; then - unset seekval - $* - elif [[ $seekval == "---" ]]; then - unset seekval - $* - fi -} - -# start/stop scrobbler. locally or remote -lastFM () { -# Some Variables to clean up the code - - if [[ $ssh_lastfm == 1 ]]; then - mpds_check="$(ssh $ssh_host -q -t "pgrep $scrobbler_kill")" - if [ -n "$mpds_check" ]; - then - ssh $ssh_host -q -t "killall $scrobbler_kill" && notify-send "MPD" "LastFM Scrobbling Disabled" - else - ssh $ssh_host -q "$scrobbler" && notify-send "MPD" "LastFM Scrobbling Enabled" - fi - else - if pgrep $scrobbler_kill - then - killall $scrobbler_kill && notify-send "MPD" "LastFM Scrobbling Disabled" - else - $scrobbler && notify-send "MPD" "LastFM Scrobbling Enabled" - fi - fi -} - - -lastFMCheck () { -# Some Variables to clean up the code - - if ((ssh_lastfm)); then - mpds_check="$(ssh $ssh_host -q -t "pgrep $scrobbler_kill")" - if [ -n "$mpds_check" ]; then - echo "lastfm: off" - else - echo "lastfm: on" - fi - else - if pgrep $scrobbler_kill - then - echo "lastfm: on" - else - echo "lastfm: off" - fi - fi -} - -currentMenu () { - if [[ $1 == "album" ]]; then - album_entry="${filename}" addAlbum alphabet - elif [[ $1 == "track" ]]; then - entry="${filename}" addTrackTags - fi - - menu=$(echo -e "< Return\n---\n1 [ Browse Albums ]>\n2 [ Browse Tracks ]>" \ - | _rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -p "Browse for $(mpc current -f '%artist%')") - - if [[ $menu == "1 [ Browse Albums ]>" ]]; then - filter=$(mpc current -f '%artist%') - firstsong=$(mpc -f '%album% %album%' search artist "$(mpc current -f '%artist%')" album "$(mpc current -f '%album%')" | head -1) - album_entry="$firstsong" filter="^$filter\s" addAlbum alphabet - - elif [[ $menu == "2 [ Browse Tracks ]>" ]]; then - filter=$(mpc current -f '%artist%') - firstsong=$(mpc -f '%file%' search artist "$(mpc current -f '%artist%')" title "$(mpc current -f '%title%')" album "$(mpc current -f '%album%')" | head -1) - entry="$firstsong" filter="$filter" addTrackTags - - elif [[ $menu == "" ]]; then - dplayPrompt - - elif [[ $menu == "< Return" ]]; then - dplayPrompt - - else - : - fi -} - -# rating menu -ratingPrompt () { - menu=("< Return" - "---" - "1 Rate current Album" - "2 Load Rated Albums" - "3 Load Random Rated Album" - "---" - "4 Rate current Track" - "5 Load Rated Tracks" - "6 Load Random Rated Tracks" - "---" - "7 Love current Song on LastFM" - "---" - "0 Backup/Restore") - - prompt() { - printf "%s\n" "$@" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Ratings > " - } - - case "$(prompt "${menu[@]}")" in - 1*) rateAlbum ;; - 2*) loadRatedAlbums ;; - 3*) loadRandomRating ;; - 4*) rateTrack ;; - 5*) loadRatedTracks ;; - 6*) loadRandomRatedTracks ;; - 7*) loveLast ;; - 0*) backupPrompt ;; - \<*) dplayPrompt ;; - *) exit - esac -} - -# create rating json files from mpd sticker database and vice versa -backupPrompt () { - menu=("< Return" - "---" - "1 Backup Album Ratings to File" - "2 Backup Track Ratings to File" - "---" - "3 Restore Ratings from File") - - prompt() { - printf "%s\n" "$@" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Backup/Restore > " - } - - case "$(prompt "${menu[@]}")" in - 1*) clerk_helper importalbumratings & ;; - 2*) clerk_helper importtrackratings & ;; - 3*) clerk_helper sendstickers & ;; - \<*) ratingPrompt ;; - *) exit - esac -} - -# if mpdas is used use mpc to love track on last.fm. otherwise try -# lastfm-mpd-cli -loveLast () { - if [[ "$scrobbler" == "mpdscribble" ]]; then - lastfm-mpd-cli love > /dev/null && notify-send "MPD" "Loved $(mpc current -f '%title%') on LastFM" && exit - elif [[ "$scrobbler" == "mpdas" ]]; then - mpc sendmessage mpdas love - fi -} - -infoPrompt () { - menu=("0 Return to Main Menu" - "---" - "1 Artist Info" - "2 Album Info" - "3 Current Track Lyrics" - "4 Current Track Tags") - - prompt() { - printf "%s\n" "$@" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "MPD Menu > " - } - - case "$(prompt "${menu[@]}")" in -# 1*) surfraw yubnub allmusic $(mpc current -f %artist%) ;; - 1*) artistinfo ;; - 2*) surfraw yubnub allmusic $(mpc current -f %album%) && exit;; -# 3*) surfraw yubnub google $(mpc current -f %title%) $(mpc current -f %artist%) lyrics ;; - 3*) lyrics ;; - 4*) currentTag ;; - \<*) dplayPrompt ;; - *) exit - esac -} - -currentTag () { - declare -i seen=0 - while read line - do - seen=1 - if [[ "$line" == "0 Return to Main Menu" ]]; then - dplayPrompt - elif [[ "$line" == "Show all Tags" ]]; then - readComments - elif [[ "$line" == "" ]]; then - return - fi - done < <(echo -e "0 Return to Main Menu\n---\nShow all Tags\n---\n$(mpc current --format "Artist: %artist%\nAlbum: %album%\nDate: %date%\nTrack: %track%\nTitle: %title%")" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p 'Current Song > ') - - if [[ $seen = 0 ]] - then - exit - fi -} - -# read all tags from file. Note that mpd can only read vorbiscomment properly -readComments () { - declare -i seen=0 - while read line - do - seen=1 - if [[ "$line" == "0 Return to Main Menu" ]]; then - dplayPrompt - elif [[ "$line" == "Show Tags" ]]; then - currentTag - elif [[ "$line" == "" ]]; then - return - fi - done < <(echo -e "0 Return to Main Menu\n---\nShow Tags\n---\n$(mpc current --format '%file%' | clerk_helper readcomments)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p 'Current Song > ') - - if [[ $seen = 0 ]] - then - exit - fi -} - -# Messy options menu. -dplayOptionsPrompt () { - - # define variables to be used in menu - export status="$(mpc status)" - single=$(echo "$status" | tail -1 | gawk -F ':' '{ print $5 }' | cut -d ' ' -f 2) - random=$(echo "$status" | tail -1 | gawk -F ':' '{ print $4 }' | cut -d ' ' -f 2) - consume=$(echo "$status" | tail -1 | gawk -F ':' '{ print $6 }' | cut -d ' ' -f 2) - repeat=$(echo "$status" | tail -1 | gawk -F ':' '{ print $3 }' | cut -d ' ' -f 2) - - if [[ -a /tmp/mpd-sima.pid ]]; then - export sima=on - else - export sima=off - fi - - if [[ "$ssh_lastfm" == "1" ]]; then - mpds_check="$(ssh $ssh_host -q -t "pgrep $scrobbler_kill")" - if [ -n "$mpds_check" ]; - then export scrobble=on - else export scrobble=off - fi - else - if pgrep $scrobbler_kill - then - export scrobble=on - else - export scrobble=off - fi - fi - - export rgain="$(mpc replaygain | cut -d ' ' -f 2)" - replayGain () { - if [[ $(mpc replaygain | cut -d ' ' -f 2) == album ]]; then - mpc replaygain track > /dev/null && export rgain="track" - elif [[ $(mpc replaygain | cut -d ' ' -f 2) == track ]]; then - mpc replaygain off > /dev/null && export rgain="off" - elif [[ $(mpc replaygain | cut -d ' ' -f 2) == off ]]; then - mpc replaygain album > /dev/null && export rgain="album" - fi - } - - menu=("< Return" - "---" - "1 Random: $(echo $random)" - "2 Repeat: $(echo $repeat)" - "3 Single Mode: $(echo $single)" - "4 Consume Mode: $(echo $consume)" - "5 Replaygain: $(echo $rgain)" - "6 Scrobbling: $(echo $scrobble)" - "7 Similar Artists Mode: $(echo $sima)" - "---" - "8 Set Crossfade $(mpc crossfade | cut -d ':' -f2)" - "9 Manage Outputs" - "0 Number of Random Songs: $(echo $value)") - - prompt() { - printf "%s\n" "$@" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -auto-select -p "MPD Options > " - } - - case "$(prompt "${menu[@]}")" in - 1*) mpc random && dplayOptionsPrompt ;; - 2*) mpc repeat && dplayOptionsPrompt ;; - 3*) mpc single && dplayOptionsPrompt ;; - 4*) mpc consume && dplayOptionsPrompt ;; - 5*) replayGain && dplayOptionsPrompt ;; - 6*) lastFM && dplayOptionsPrompt ;; - 7*) mpdSima && dplayOptionsPrompt ;; - 8*) crossfadePrompt ;; - 9*) outputPrompt ;; - 0*) optionRandomPrompt ;; - \<*) dplayPrompt ;; - *) exit - esac -} - -# toggle similar artist playback -mpdSima () { - if [[ -a /tmp/mpd-sima.pid ]]; then - kill $(cat /tmp/mpd-sima.pid) - sleep 1 - else - mpd-sima -d -p /tmp/mpd-sima.pid - sleep 1 - fi -} - -# function to change number of random songs in config file -optionRandomPrompt() { - number="$(echo -e " " | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p 'Set No. of random Songs > ')" - $sed -i "s/value=.*/value="$number"/" $config_rc - export value="$number" - dplayOptionsPrompt -} - -crossfadePrompt () { - menu=$(echo -e "< Return\n---\n0\n1\n2\n3\n4\n5" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Crossfade") - - if [[ $menu == "< Return" ]]; then - dplayOptionsPrompt - else - mpc crossfade ${menu}; - dplayOptionsPrompt - fi -} - -# read list of available podcasts. Not using mpd playlists, because mpd does -# not support custom names for urls. format of podcast in file is "Name \ URL" -loadRSS () { - podcast=$(echo -e "< Return\n---\n$(cat $podcast_list | cut -d '\' -f1)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Choose Podcast > ") - val=$? - - if [[ $val -eq 1 ]]; then - exit - fi - if [[ $podcast == "< Return" ]]; then - dplayQueue - else - mpc clear - mpc load $(grep "$podcast" $podcast_list | cut -d '\' -f2) - episode=$(mpc playlist --format "%position% — %artist% — %title%" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Choose Episode > ") - POS=$(echo "$episode" | gawk -F " — " '{ print $1 }') - mpc play "$POS" - fi -} - -# suspend current playlist. playlist, song id and play-position are saved to -# $XDG_DATA_HOME:-$HOME/.local/share/clerk/suspend -suspendPlaylist () { - playing=$(! mpc status | grep 'playing\|paused') - time=$(mpc status | $sed '2!d;s;/.:.*;;;s;.* ;;') - position=$(mpc current --format '%position%') - if [[ -z "$playing" ]]; then - notify-send "clerk" "mpd is not playing, no state to suspend" - else - mpc rm suspended - mpc save suspended - rm -f $suspend_state - echo "pos="$position"" >> $suspend_state - echo "time="$time"" >> $suspend_state - if [[ "$stop_after_suspend" == yes ]]; then - mpc stop - else - echo " " - fi - notify-send "Clerk" "Playlist suspended" - if [[ $cli == "true" ]]; then - exit - else - dplayQueue - fi - fi -} - -# read $XDG_DATA_HOME/clerk/suspend:-$HOME/.local/share/clerk/suspend and -# restore playlist. Then start playing # from same position that was saved in -# suspend file -resumePlaylist () { - http=$(! mpc current --format %file% | grep 'http://') - source $suspend_state - mpc clear - mpc load suspended - mpc play $pos - mpc toggle - sleep 2 - mpc seek "$time" - mpc toggle - notify-send "Clerk" "Resumed last-suspended Playlist" - if [[ $cli == "true" ]]; then - exit - else - dplayQueue - fi -} - -# Play or delete items from current Queue -dplayQueue () { - while true; do - if [[ $val -eq 1 ]]; then - exit - fi - re='^[0-9]+$' - if [[ "$POS" =~ $re ]]; then - if [[ $last != $(mpc -f '%file%' playlist | tail -1) ]]; then - POS=$(echo $(( $POS + 1 ))) - elif [[ -z $last ]]; then - POS=$(echo $(( $POS + 2 ))) - else - POS=$(echo $(( $POS + 2 ))) - fi - else - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 1 ))) - else - POS=$(echo $(( $(mpc current -f '%position%') + 2 ))) - fi - fi - select="-selected-row $POS" - - help_text="$(echo -e "${delete}: Delete - ${crop}: Crop - ${moveup}: Move Up - ${goalbum}: Go to Album - ${chplaylist}: Load/Save\n${clear}: Clear - ${rate}: Rate - ${movedown}: Move Down - ${gotrack}: Go to Track" | column -s '-' -t | perl -pe "s/ - /<span color='$help_separator_color'\>\|\<\/span\>/g")" - line1=$(echo "${help_text}" | head -1) - line2=$(echo "${help_text}" | tail -1) -HELP="<span color='$help_color'>${line1} -${line2}</span>" - -songs () { - mpc --format '%position%\t%track%\t%title%\t%artist%\t(%date%)\t%album%' playlist \ - | gawk -F '\t' '{ printf "%.4s\t%."'${track_width}'"s\t%."'${pl_title_width}'"s\t%."'${pl_artist_width}'"s\t%."'${date_width}'"s\t%."'${album_width}'"s\n", $1, $2, $3, $4, $5, $6 }' \ - | column -s $'\t' -t -} - - if [[ -n $(mpc current) ]]; then - current=$(mpc current -f '%position%') - highlight="-a $(echo $(( $current +1 )))" - else - : - fi - - TRACKDISPLAY=$(echo -e "< Return\n---\n$(songs)" \ - | _rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -kb-custom-1 "${delete}" \ - -kb-custom-2 "${rate}" \ - -kb-custom-4 "${prevalbum}" \ - -kb-custom-3 "${nextalbum}" \ - -kb-custom-5 "${clear}" \ - -kb-custom-6 "${moveup}" \ - -kb-custom-7 "${movedown}" \ - -kb-custom-8 "${toggle}" \ - -kb-custom-9 "${stop}" \ - -kb-custom-10 "${albumlist}" \ - -kb-custom-11 "${tracklist}" \ - -kb-custom-12 "${goalbum}" \ - -kb-custom-13 "${gotrack}" \ - -kb-custom-14 "${chplaylist}" \ - -kb-custom-15 "${next}" \ - -kb-custom-16 "${crop}" \ - -kb-custom-18 "${stop}" \ - -kb-custom-19 "${seek}" \ - -kb-custom-17 "${prev}" \ - -dmenu $(echo "${select}") $(echo "${highlight}") \ - -mesg "${HELP}" \ - -p "Current Queue > ") - - val=$? - - TRACKDISPLAY_NEW=$(echo "${TRACKDISPLAY}" | perl -pe "s/ +/\t/g") - POS=$(echo "${TRACKDISPLAY_NEW}" | gawk -F '\t' '{ print $1 }') - ARTIST=$(echo "${TRACKDISPLAY_NEW}" | gawk -F '\t' '{ print $4 }') - TITLE=$(echo "${TRACKDISPLAY_NEW}" | gawk -F '\t' '{ print $3 }') - - if [[ $val -eq 1 ]]; then - exit - - elif [[ $val -eq 10 ]]; then - last=$(mpc playlist -f '%file%' | tail -1) - mpc del $POS; - POS2=$(echo "$POS" | head -1) - POS=$(( $POS2 - 1)); - dplayQueue - - elif [[ $val -eq 19 ]]; then - addAlbum alphabet - - elif [[ $val -eq 20 ]]; then - addTrackTags - - elif [[ $val -eq 23 ]]; then - plMenu - - elif [[ $val -eq 24 ]]; then - mpc next - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 0 ))) - fi - - elif [[ $val -eq 26 ]]; then - mpc prev - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 0 ))) - fi - - elif [[ $val -eq 27 ]]; then - mpc stop - - elif [[ $val -eq 28 ]]; then - seekMenu - - elif [[ $val -eq 21 ]]; then - temp=$(mpc playlist --format '%position%\t%file%' | grep -P "^${POS}\t" | gawk -F '\t' '{ print $2 }') - info=$(mpc --format '%albumartist%\t%album%\t%date%\t%track%\t%title%' search filename "${temp}") - - ARTIST=$(echo "${info}" \ - | gawk -F '\t' '{ print $1 }') - ALBUM=$(echo "${info}" \ - | gawk -F '\t' '{ print $2 }') - DATE=$(echo "${info}" \ - | gawk -F '\t' '{ print $3 }') - - filename="${ARTIST} ${ALBUM}" currentMenu album - - - elif [[ $val -eq 22 ]]; then - filename=$(mpc playlist --format '%position%\t%file%' | grep -P "^${POS}\t" | grep "${ARTIST}" | gawk -F '\t' '{ print $2 }') currentMenu track - - elif [[ $val -eq 25 ]]; then - unset last - if [[ $TRACKDISPLAY_NEW == *">"* || $TRACKDISPLAY_NEW == *"<"* || $TRACKDISPLAY_NEW == "---" ]]; then - mpc crop - else - mpc play $POS; - mpc crop - fi - - elif [[ $val -eq 16 ]]; then - if [[ $(echo "$TRACKDISPLAY_NEW" | wc -l) -gt 1 ]]; then - : -# unset last -# posSelect=$(echo "$(songs)" | _rofi -kb-move-word-forward '' -dmenu -mesg "Move after >") -# if [[ $posSelect == "" ]]; then -# exit; -# else -# chosenPos=$(echo "$posSelect" | awk -F ' ' '{print $1}') -# trackids="$(echo -e "$POS\n" | sed \$d)" -# POS=$(echo -e "$trackids" | head -1) -# echo "$trackids" | sort -n | tac | while read POS2; do -# mpc mv $POS2 $chosenPos -# chosenPos=$chosenPos -# done -# POS=$(echo "${chosenPos}"); -# fi - else - unset last - mpc mv $POS $(echo $(( $POS + 1 ))) - POS=$(echo $(( $POS + 1 ))); - fi - - - - elif [[ $val -eq 15 ]]; then - if [[ $(echo "$TRACKDISPLAY_NEW" | wc -l) -gt 1 ]]; then - : -# unset last -# posSelect=$(echo "$(songs)" | _rofi -kb-move-word-forward '' -dmenu -mesg "Move after >") -# if [[ $posSelect == "" ]]; then -# exit; -# else -# chosenPos=$(echo "$posSelect" | awk -F ' ' '{print $1}') -# trackids="$(echo -e "$POS\n" | sed \$d)" -# POS=$(echo -e "$trackids" | head -1) -# echo "$trackids" | sort -n | tac | while read POS2; do -# mpc mv $POS2 $chosenPos -# chosenPos=$chosenPos -# done -# POS=$(echo "${chosenPos}"); -# fi - else - unset last - mpc mv $POS $(echo $(( $POS - 1 ))) - POS=$(echo $(( $POS - 1 ))); - fi - - - elif [[ $val -eq 17 ]]; then - unset last - mpc toggle - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 0 ))) - fi - - elif [[ $val -eq 18 ]]; then - unset last - mpc stop - - elif [[ $val -eq 12 ]]; then - unset last - skipAlbum next - unset IFS - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 0 ))) - fi - dplayQueue - - elif [[ $val -eq 13 ]]; then - unset last - skipAlbum prev - unset IFS - mpd_play=$(mpc status | mpc status | grep -E '\[playing\]|\[paused\]') - if [[ -n ${mpd_play} ]]; then - POS=$(echo $(( $(mpc current -f '%position%') + 0 ))) - fi - dplayQueue - - elif [[ $val -eq 14 ]]; then - unset last - if [[ $TRACKDISPLAY_NEW == *""* ]]; then - mpc clear - fi - - elif [[ $val -eq 0 ]]; then - unset last - if [[ $TRACKDISPLAY_NEW == "< Return" ]]; then - dplayPrompt - else - mpc play $POS; - fi - - elif [[ $val -eq 11 ]]; then - unset last - - filename=$(mpc playlist --format '%position%\t%file%' | grep "^${POS}" | grep "${ARTIST}" | gawk -F '\t' '{ print $2 }') - info=$(mpc --format '%artist%\t%album%\t%date%\t%track%\t%title%' search filename "${filename}") - echo "${info}" - - ARTIST=$(echo "${info}" \ - | gawk -F '\t' '{ print $1 }') - ALBUM=$(echo "${info}" \ - | gawk -F '\t' '{ print $2 }') - DATE=$(echo "${info}" \ - | gawk -F '\t' '{ print $3 }') - TRACK=$(echo "${info}" \ - | gawk -F '\t' '{ print $4 }') - TITLE=$(echo "${info}" \ - | gawk -F '\t' '{ print $5 }') - rateartist="${ARTIST}" ratealbum="${ALBUM}" ratetrack="${TRACK}" ratetitle="${TITLE}" rateTrack - - elif [[ $TRACKDISPLAY_NEW == "< Return" ]]; then - dplayQueue - fi - done -} - -plMenu () { - plmenu=$(echo -e "< Return\n---\n1 [ Load Playlist ]\n2 [ Save Playlist ]" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -auto-select -dmenu -p "Load/Save Playlist > ") - if [[ $plmenu == "1"* ]]; then - dplayQueueLoad - elif [[ $plmenu == "2"* ]]; then - dplayQueueSave - elif [[ $plmenu == "< Return" ]]; then - dplayQueue - elif [[ $plmenu == "" ]]; then - exit - fi -} - -skipAlbum () { -IFS=' -' - - _PLAYLISTTEMP=$(mpc playlist --format "%album%" | awk -F'\n' '{print "_" $1}') - _PLAYLIST=($_PLAYLISTTEMP) - ACTNR=$(mpc --format "%position%" | head -n 1) # works >= mpc git 2009-11-28 - ACTALBUM="_"$(mpc --format "%album%" | head -n 1) - SONGSANZ=${#_PLAYLIST[*]} - - case $1 in - next) - # Next album - for (( IDX=$ACTNR; $IDX<$SONGSANZ; IDX++ )) - do - if [ ${_PLAYLIST[$IDX]} != $ACTALBUM ]; then - let IDX+=1 - mpc play $IDX - echo New album \(next\) IDX: $IDX - break - fi - done - ;; - prev) - # Previous album - #GETEND=FALSE - ACTNRTEMP=$ACTNR - let ACTNRTEMP-=2 - for (( IDX=$ACTNR-2; $IDX>=0; IDX-- )) - do - #echo TEST0 IDX $IDX - echo IDX: $IDX - ${_PLAYLIST[$IDX]} - if [ ${_PLAYLIST[$IDX]} != $ACTALBUM ]; then - # if [ $GETEND = TRUE ]; then - if [ $IDX -ne $ACTNRTEMP ]; then - #echo TEST: IDX:$IDX $ACTNRTEMP - let IDX+=2 - mpc play $IDX - echo New album \(prev\) IDX: $IDX - break - fi - ACTALBUM=${_PLAYLIST[$IDX]} - #echo ALBUMENDE ERKANNT BEI IDX: $IDX - #GETEND=TRUE - fi - if [ $IDX = 0 ]; then - #if [ $GETEND = FALSE ]; then - # mpc play 1 - # break - #fi - mpc play 1 - break - fi - done - ;; - *) - echo "usage: $0 {prev|next}" - ;; - esac -} - -# show all mpd playlists and load them to queue -dplayQueueLoad () { - _playlist=$(echo -e "< Return\n---\n$(mpc lsplaylists | sort)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Load Playlist > ") - val=$? - if [[ $val -eq 1 ]]; then - exit - fi - if [[ "$_playlist" == "< Return" ]]; then - dplayQueue - else - mpc clear - mpc load "$_playlist" && dplayQueue - fi -} - -# save current playlist to playlist file. -dplayQueueSave () { - while read playlists - do - val=$? - if [[ $val -eq 1 ]]; then - exit - fi - if [[ "$playlists" == "< Return" ]]; then - dplayQueue - elif [[ "$playlists" == "Save new Playlist" ]]; then - playlist=$(echo "" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Type Name for Playlist > ") - if [[ "$playlist" == "" ]]; then - dplayQueueSave - else - mpc save "$playlist" - dplayQueue - fi - else - playlist=$(echo -e "0 Return to Playlist Menu\n---\nYes\nNo" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Overwrite Playlist? > ") - if [[ "$playlist" == "Yes" ]]; then - mpc rm "$playlists" - mpc save "$playlists" - elif [[ "$playlist" == "No" ]]; then - playlist=$(echo "" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Type Name for Playlist > ") - if [[ "$playlist" == "" ]]; then - dplayQueue - else - mpc save "$playlist" - dplayQueue - fi - fi - fi - done < <(echo -e "< Return\n---\nSave new Playlist\n---\n$(mpc lsplaylists)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Choose Playlist > ") - exit -} - -# enable/disable outputs -outputPrompt () { - menu="$(echo -e "0 Return to Options Menu\n---\n$(mpc outputs)" \ - | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Outputs > ")"; - - if [[ "$menu" == "0 Return to Options Menu" ]] - then dplayOptionsPrompt; - elif [[ "$menu" == "" ]]; then - exit - else - mpc toggleoutput $(echo "$menu" \ - | gawk '{print $2}'); - - notify-send "MPD" "$(echo "$menu" \ - | $sed -e 's/enabled$/disabled/;ta;s/disabled$/enabled/;:a;')"; - - outputPrompt - fi -} - -# rate any album -rateAlbum () { - rating="$(seq 10 | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Select Album Rating: > ")" - - if [[ $rating == "" ]]; then - exit - else - # check if rateartist was defined, if it wasn't use currently playing - # track for rating, otherwise use what was delivered in the rate* - # variables. - if [[ -z "$rateartist" ]]; then - artist=$(mpc current -f '%artist%') - album=$(mpc current -f '%album%') - date=$(mpc current -f '%date%') - if [[ -n $(mpc find track "1" albumartist "${artist}" album "${album}" date "${date}") ]]; then - track="1" - else - track="01" - fi - disc=$(mpc current -f '%disc%') - export disc=${disc} - export track=${track} - clerk_helper ratealbum "${artist}" "${album}" "${date}" "${rating}" - notify-send "clerk" "rated ${artist} - ${album} with ${rating}" - else - export disc=${disc} - export track=${track} - clerk_helper ratealbum "${rateartist}" "${ratealbum}" "${ratedate}" "${rating}" - notify-send "clerk" "rated ${rateartist} - ${ratealbum} with ${rating}" - fi - fi -} - -rateTrack () { - rating="$(echo -e "< Return\n---\n$(seq 10)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Select Track Rating: > ")" - - if [[ $rating == "" ]]; then - exit - elif [[ $rating == "< Return" ]]; then - dplayQueue - else - if [[ -z "$rateartist" ]]; then - export rating=${rating} - rateartist=$(mpc current -f '%artist%') - ratetitle=$(mpc current -f '%title%') - ratetrack=$(mpc current -f '%track%') - ratealbum=$(mpc current -f '%album%') - - clerk_helper ratetrack "${rateartist}" "${ratealbum}" "${ratetrack}" "${ratetitle}" "${rating}" - notify-send "clerk" "rated $(mpc current) with $(echo ${rating})" - else - clerk_helper ratetrack "${rateartist}" "${ratealbum}" "${ratetrack}" "${ratetitle}" "${rating}" - notify-send "clerk" "rated ${rateartist} - ${ratetitle} with $(echo ${rating})" - fi - if [[ $auto_track_rating_backup == "true" ]]; then - if [[ -f $last_track_rate_bak ]]; then - read -r lastbackup<$last_track_rate_bak - else - lastbackup=$(date "+%s") - fi - if [[ $(date "+%s") -gt $(( $lastbackup + 3600)) ]]; then - rm -f $db_rate_track - clerk_helper importtrackratings - rm -f $last_track_rate_bak - fi - date "+%s" > $last_track_rate_bak - fi - fi -} - -# function to instantly rate a track without a submenu. rating is defined on -# commandline -instantRateTrack () { - rateartist=$(mpc current -f '%artist%') - ratetitle=$(mpc current -f '%title%') - ratetrack=$(mpc current -f '%track%') - ratealbum=$(mpc current -f '%album%') - export rating=$1 - clerk_helper ratetrack "${rateartist}" "${ratealbum}" "${ratetrack}" "${ratetitle}" "${rating}" - notify-send "clerk" "rated ${rateartist} - ${ratetitle} with $(echo ${rating})" - if [[ $auto_track_rating_backup == "true" ]]; then - if [[ -f $last_track_rate_bak ]]; then - read -r lastbackup<$last_track_rate_bak - else - lastbackup=$(date "+%s") - fi - if [[ $(date "+%s") -gt $(( $lastbackup + 3600)) ]]; then - rm -f $db_rate_track - clerk_helper importtrackratings - rm -f $last_track_rate_bak - fi - date "+%s" > $last_track_rate_bak - fi -} - -# load rated albums with minimum rating of xx -loadRatedAlbums () { - rating="$(seq 10 | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Minimum Rating > ")" - - if [[ $rating == "" ]]; then - exit - else - albums="$(while read -a line; do - dirname "${line[*]}"; - done <<< "$(mpc sticker "" find albumrating \ - | grep -E "albumrating=$rating")" \ - | $sed 's/\/\CD.*//g' \ - | sort \ - | uniq \ - | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Choose Album > ")" - - if [[ $albums == "" ]]; then - exit - else - mpc clear; - mpc add "$albums"; - mpc play - - fi - fi -} - - -loadRatedTracks () { - rating="$(seq 10 | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Rating > ")" - if [ rating = "" ]; then - exit - else - cd $config_root - mpc clear - songs="$(mpc sticker "" find rating | grep "rating=$rating" | gawk -F ': rating=' '{ print $1 }')" - echo "$songs" | mpc add - mpc play - fi -} - -loadRandomRatedTracks () { - number="$(echo " " | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Number of Songs > " | xargs echo)" - rating="$(seq 10 | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Minimum Rating > ")" - if [ rating = "" ]; then - exit - else - cd $config_root - mpc clear - songs="$(mpc sticker "" find rating \ - | grep -E "rating=$rating|rating=$(echo $(( $rating + 1 )))|rating=$(echo $(( $rating + 2 )))|rating=$(echo $(( $rating + 3 )))|rating=$(echo $(( $rating + 4 )))" \ - | gawk -F ':' '{ print $1 }')" - - echo "$songs" \ - | $shuf -n $number \ - | mpc add - - mpc play - rm -f /tmp/clerk_tracklist - fi -} - -loadRandomRating () { - rating="$(seq 10 | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Minimum Rating > ")" - if [ rating = "" ]; then - exit - else - album="$(while read -a line; do - dirname "${line[*]}"; - done <<< "$(mpc sticker "" find albumrating \ - | grep -E "albumrating=$rating|albumrating=$(echo $(( $rating+1 )))|albumrating=$(echo $(( $rating+2 )))|albumrating=$(echo $(( $rating+3 )))|albumrating=$(echo $(( $rating+4 )))|albumrating=$(echo $(( $rating+5 )))|albumrating=$(echo $(( $rating+6 )))")" \ - | $sed 's/\/\CD.*//g' \ - | $shuf -n1)" - - mpc clear; - mpc add "$album"; - mpc play - fi -} - -# load random album. Make sure to make each sub item random. this way each -# artist has equal chances of being played, no matter how many albums it has. -playRandomAlbum () { - mpc clear > /dev/null - artist="$(mpc list "albumartist" | $shuf -n 1)" - album="$(mpc list album "albumartist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "albumartist" "$artist"; - mpc play > /dev/null -} - -# same for tracks, no artist should be preferred because it has more tracks. -playRandomTracks () { - mpc clear > /dev/null - artist="$(mpc list "$random_artist" | $shuf -n 1)" - album="$(mpc list album "$random_artist" "$artist" | $shuf -n 1)" - title="$(mpc list title album "$album" "$random_artist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "$random_artist" "$artist" title "$title"; - mpc play > /dev/null - - n=0; while (( n++ < $value -1 )); do - artist="$(mpc list "$random_artist" | $shuf -n 1)" - album="$(mpc list album "$random_artist" "$artist" | $shuf -n 1)" - title="$(mpc list title album "$album" "$random_artist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "$random_artist" "$artist" title "$title" - done - mpc play > /dev/null - exit -} - -exitAfterAdd () { - if [[ $exit_after_add == "yes" ]]; then - exit - elif [[ $exit_after_add == "no" ]]; then - : - fi -} - -addAlbum() { - - displaystyle () { - mode="$1" - help_text="$(echo -e "${add}: Add - ${insert}: Insert - ${replace}: Replace (Default) - ${savefav}: Save\n${rate}: Rate - ${addplay}: Add + Play - ${insertplay}: Insert + Play" | column -s '-' -t | perl -pe "s/ - /<span color='$help_separator_color'\>\|\<\/span\>/g")" - line1=$(echo "${help_text}" | head -1) - line2=$(echo "${help_text}" | tail -1) - HELP="<span color='$help_color'>${line1} -${line2}</span>" - - if [[ $1 == "latest" ]]; then - album_list="latest.cache" - elif [[ $1 == "alphabet" ]]; then - album_list="albums.cache" - fi - - ALBUM_TEMP="$(_rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -sep '\n' \ - -matching regex \ - -kb-custom-1 "${add}" \ - -kb-custom-2 "${insert}" \ - -kb-custom-3 "${replace}" \ - -kb-custom-8 "${rate}" \ - -kb-custom-4 "${addplay}" \ - -kb-custom-5 "${insertplay}" \ - -kb-custom-6 ${tracklist} \ - -kb-custom-7 ${queue} \ - -kb-custom-9 ${prev} \ - -kb-custom-10 ${toggle} \ - -kb-custom-11 ${stop} \ - -multi-select \ - -kb-custom-12 ${next} \ - -kb-custom-13 ${seek} \ - -kb-custom-14 ${savefav} \ - -kb-accept-alt "Tab" \ - -kb-custom-15 ${nextalbum} \ - -kb-custom-16 ${prevalbum} \ - -dmenu -filter "$filter" \ - -select "$album_entry" \ - -format "f¬s" \ - -input "$data_root/${album_list}" \ - -p "Choose Album > ")" - } - returnto () { - if [[ $mode == "latest" ]]; then - addAlbum latest - elif [[ $mode == "alphabet" ]]; then - addAlbum alphabet - fi - } - - mode=$1 - displaystyle $mode - - val=$? - - ALBUM_ORIG="${ALBUM_TEMP#*¬}" - firstline=$(echo "$ALBUM_ORIG" | sed 's/.*¬//g' | tail -1 | awk -F '\t' '{ print $NF }') - unset filter - export filter_temp="${ALBUM_TEMP%¬*}" - ALBUM=$(echo "${ALBUM_ORIG}" | sed 's/.*¬//g' | awk -F '\t' '{ print $NF }') - export filter=$(echo "$filter_temp" | head -1 | sed 's/¬.*//g') - - if [[ -z "$ALBUM" ]]; then - exit - else - if [[ $val -eq 11 ]]; then - echo -e "$ALBUM" | uniq | while read line; do - mpc insert "${line}" - exit - done - album_entry="$firstline" - exitAfterAdd - returnto - - elif [[ $val -eq 12 ]]; then - mpc clear; - echo -e "$ALBUM" | uniq | while read line; do - mpc add "${line}" - done - mpc play - album_entry="$firstline" - exitAfterAdd - returnto - - elif [[ $val -eq 0 ]]; then - if [[ "$ALBUM" == "< Return" ]]; then - unset artist - browseLibPrompt - - elif [[ "$ALBUM" == "" ]]; then - returnto $mode - - else - mpc clear - echo -e "$ALBUM" | uniq | while read line; do - mpc add "${line}" - done - mpc play - album_entry="$firstline" - exitAfterAdd - returnto - fi - - elif [[ $val -eq 10 ]]; then - echo "$ALBUM" | uniq | while read line; do - mpc add "$(echo -e "${line}" | awk -F '\t' '{ print $NF }')" - done - album_entry="$firstline" - exitAfterAdd - returnto - - elif [[ $val -eq 15 ]]; then - album_entry="${firstline}" - addTrackTags - returnto - - elif [[ $val -eq 16 ]]; then - album_entry="${firstline}" - dplayQueue - - elif [[ $val -eq 13 ]]; then - currentid=$(mpc current -f "%position%") - echo -e "$ALBUM" | uniq | while read line; do - mpc add "$(echo -e "${line}" | awk -F '\t' '{ print $NF }')" - done - mpc play "$(echo "$(( $currentid + 1 ))")" - album_entry="$firstline" - - elif [[ $val -eq 18 ]]; then - mpc prev - album_entry="${firstline}" - returnto - - elif [[ $val -eq 19 ]]; then - mpc toggle - album_entry="${firstline}" - returnto - - elif [[ $val -eq 20 ]]; then - mpc stop - album_entry="${firstline}" - returnto - - elif [[ $val -eq 21 ]]; then - mpc next - album_entry="${firstline}" - returnto - - elif [[ $val -eq 22 ]]; then - album_entry="${firstline}" - seekMenu addAlbum $1 - - elif [[ $val -eq 23 ]]; then - album_entry="${firstline}" - ALBUM="$ALBUM" saveAlbumToPlaylist selection - - elif [[ $val -eq 24 ]]; then - skipAlbum next - unset IFS - album_entry="${firstline}" - returnto - - elif [[ $val -eq 25 ]]; then - skipAlbum prev - unset IFS - album_entry="${firstline}" - returnto - - elif [[ $val -eq 17 ]]; then - if [[ -n $(mpc find -f '%disc%' albumartist "${artist}" album "${album}" date "${date}") ]]; then - disc=$(mpc find -f '%disc%' albumartist "${artist}" album "${album}" date "${date}" | head -1) - else - disc="" - fi - if [[ -n $(mpc find track "1" albumartist "${artist}" album "${album}" date "${date}") ]]; then - track="1" - else - track="01" - fi - disc=${disc} track=${track} rateartist="${artist}" ratealbum="${album}" ratedate="${date}" rateAlbum - album_entry="$firstline" - - elif [[ $val -eq 14 ]]; then - currentid=$(mpc current -f "%position%") - echo -e "$ALBUM" | uniq | while read line; do - mpc insert "$(echo -e "${line}" | awk -F '\t' '{ print $NF }')" - done - mpc play "$(echo "$(( $currentid + 1 ))")" - album_entry="$firstline" - - elif [[ $val -eq 1 ]]; then - exit - fi - returnto - fi -} - -addTrackTags() { - help_text=$(echo -e "${add}: Add (Default) - ${insert}: Insert - ${replace}: Replace \ - \n${rate}: Rate - ${addplay}: Add + Play - ${insertplay}: Insert + Play" \ - | column -s '-' -t | perl -pe "s/ - /<span color='$help_separator_color'\>\|\<\/span\>/g") - # -o "<span color='$help_separator_color'>|</span>" -t) - line1=$(echo "${help_text}" | head -1) - line2=$(echo "${help_text}" | tail -1) -HELP="<span color='$help_color'>${line1} -${line2}</span>" - - -TRACK_TEMP="$(_rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -kb-custom-1 "${add}" \ - -kb-custom-2 "${insert}" \ - -kb-custom-3 "${replace}" \ - -kb-custom-8 "${rate}" \ - -kb-custom-4 "${addplay}" \ - -kb-accept-alt "Tab" \ - -multi-select \ - -kb-custom-5 "${insertplay}" \ - -kb-custom-6 ${albumlist} \ - -kb-custom-7 ${queue} \ - -kb-custom-9 ${prev} \ - -kb-custom-10 ${toggle} \ - -kb-custom-11 ${stop} \ - -kb-custom-12 ${next} \ - -kb-custom-13 ${seek} \ - -kb-custom-14 ${nextalbum} \ - -kb-custom-15 ${prevalbum} \ - -dmenu -filter "$filter" \ - -select "$entry" \ - -format "f¬s" \ - -mesg "${HELP}" \ - -input "$cache_track" \ - -p "Choose Track > ")" - - val=$? - TRACK_ORIG="${TRACK_TEMP#*¬}" - firstline=$(echo "${TRACK_ORIG}" | sed 's/.*¬//g' | tail -1) - unset filter - export filter_temp="${TRACK_TEMP%¬*}" - TRACK="$(echo "${TRACK_ORIG}" | perl -pe "s/ +/\t/g" | sed 's/.*¬//g')" - export filter=$(echo "$filter_temp" | head -1 | sed 's/¬.*//g') - - if [[ -z "$TRACK" ]]; then - exit - else - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - - if [[ $val -eq 11 ]]; then - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - echo "$filename" | uniq | while read line; do - mpc insert "${line}" - done - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 12 ]]; then - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - mpc clear; - echo "$filename" | uniq | while read line; do - mpc add "${line}" - done - mpc play - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 10 ]]; then - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - echo "$filename" | uniq | while read line; do - mpc add "${line}" - done - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 0 ]]; then - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - echo "$filename" | uniq | while read line; do - mpc add "${line}" - done - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 13 ]]; then - title=$(echo "$TRACK" | gawk -F '\t' '{print $2}' | head -1) - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - echo "$filename" | uniq | while read line; do - mpc add "${line}" - done - mpc searchplay "${title}" - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 15 ]]; then - addAlbum alphabet - - elif [[ $val -eq 16 ]]; then - dplayQueue - - elif [[ $val -eq 14 ]]; then - title=$(echo "$TRACK" | gawk -F '\t' '{print $2}' | head -1) - filename=$(echo "$TRACK" | gawk -F '\t' '{print $NF}') - echo "$filename" | uniq | while read line; do - mpc insert "${line}" - done - mpc searchplay "${title}" - entry="$firstline" - exitAfterAdd - - elif [[ $val -eq 18 ]]; then - mpc prev - - elif [[ $val -eq 19 ]]; then - mpc toggle - entry="${firstline}" - - elif [[ $val -eq 20 ]]; then - mpc stop - entry="${firstline}" - - elif [[ $val -eq 21 ]]; then - mpc next - entry="${firstline}" - - elif [[ $val -eq 22 ]]; then - entry="${firstline}" - seekMenu addTrackTags - - elif [[ $val -eq 23 ]]; then - skipAlbum next - unset IFS - entry="${firstline}" - - elif [[ $val -eq 24 ]]; then - skipAlbum prev - unset IFS - entry"${firstline}" - - elif [[ $val -eq 17 ]]; then - info=$(mpc search --format '%artist%\t%album%\t%date%\t%track%\t%title%' filename "${filename}") - artist="$(echo "$info" \ - | gawk -F '\t' '{ print $1 }')" - album="$(echo "$info" \ - | gawk -F '\t' '{ print $2 }')" - date="$(echo "$info" \ - | gawk -F '\t' '{ print $3 }')" - track="$(echo "$info" \ - | gawk -F '\t' '{ print $4 }')" - title="$(echo "$info" \ - | gawk -F '\t' '{ print $5 }')" - - echo "${artist} ${album} ${date} ${track} ${title}" - rateartist="${artist}" ratealbum="${album}" ratetrack="${track}" ratetitle="${title}" rateTrack - entry="$firstline" - elif [[ $val -eq 1 ]]; then - exit - fi - addTrackTags - fi -} - -browseLibPrompt() { - menu="$((echo -e "< Return\n---\n1 [ Choose Albums ]>\n2 [ Choose Track ]>\n3 [ Browse Latest Additions ]>\n---\n4 [ Play Random Album ]\n5 [ Play Random Tracks ]\n---\n6 [ Update Album/Track Cache ]") \ - | _rofi -kb-move-word-forward '' \ - -kb-row-tab '' \ - -dmenu \ - -auto-select \ - -kb-custom-1 ${albumlist} \ - -kb-custom-2 ${tracklist} \ - -kb-custom-3 ${queue} \ - -p "Library Menu > ")" - - val=$? - - if [[ $val -eq 1 ]]; then - exit - elif [[ $val -eq 10 ]]; then - addAlbum alphabet - elif [[ $val -eq 11 ]]; then - addTrackTags - elif [[ $val -eq 12 ]]; then - dplayQueue - elif [[ $val -eq 13 ]]; then - nowPlaying - fi - - if [[ "${menu}" == "1 "* ]]; then - addAlbum alphabet - elif [[ "${menu}" == "2 "* ]]; then - addTrackTags - elif [[ "${menu}" == "6 "* ]]; then - updateCache; - browseLibPrompt - elif [[ "${menu}" == "< "* ]]; then - dplayPrompt - elif [[ "${menu}" == "3 "* ]]; then - addAlbum latest - elif [[ "${menu}" == "4 "* ]]; then - playRandomAlbum - elif [[ "${menu}" == "5 "* ]]; then - playRandomTracks - fi -} - -saveAlbumToPlaylist() { - if [[ $1 == "selection" ]]; then - TRACK="${TRACK}" - else - TRACK="$((echo -e "< Return\n---"; cat $cache_album) | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Save Album to Playlist > ")" - fi - - val=$? - - if [[ $val -eq 1 ]]; then - exit - fi - - if [[ "$TRACK" == "< Return" ]]; then - dplayPrompt - elif [[ "$TRACK" == "---" ]]; then - saveAlbumToPlaylist - else - artist=$(echo -en "$TRACK" \ - | gawk -F '\t' '{ print $1 }' \ - | sed -e 's/[[:space:]]*$//') - group2=$(echo -en "$TRACK" \ - | gawk -F '\t' '{ print $2 "\t" $3}' \ - | sed -e 's/[[:space:]]*$//') - album=$(echo -en "$group2" \ - | gawk -F "\t" '{print $2}') - date=$(echo -en "$group2" \ - | gawk -F "\t" '{print $1}' \ - | gawk '{print substr($0, 2, length($0) - 2)}') - clear - echo "${artist} ${album} ${date}" - - mpc search date "$date" album "$album" albumartist "$artist" | clerk_helper saveto - fi - saveAlbumToPlaylist -} - - -saveLatestToPlaylist() { - declare -i seen=0 - while read TRACK - do - seen=1 - if [[ "$TRACK" == "0 Return to Main Menu" ]] - then dplayPrompt - else - artist=$(echo -en "$TRACK" \ - | gawk -F '\t' '{ print $1 }' \ - | sed -e 's/[[:space:]]*$//') - group2=$(echo -en "$TRACK" \ - | gawk -F '\t' '{ print $2 }' \ - | sed -e 's/[[:space:]]*$//') - album=$(echo "$group2" \ - | gawk -F " — " '{print $2}') - date=$(echo "$group2" \ - | gawk -F " — " '{print $1}' \ - | gawk '{print substr($0, 2, length($0) - 2)}') - - mpc search date "$date" album "$album" albumartist "$artist" | clerk_helper saveto - fi - done < <(echo -e "0 Return to Main Menu\n---\n$(cat $cache_latest)" | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -p "Save Album to Playlist > ") - - if [[ $seen = 0 ]] - then - exit - fi -} - -saveTrackToPlaylist() { - TRACK_TEMP="$((echo -e "0 Return to Main Menu\n---"; cat $cache_track) | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -filter "$filter" -select "$entry" -format "f¬s" -dmenu -p "Save Track to Playlist > ")" - - TRACK="${TRACK_TEMP#*¬}" - unset filter - export filter="$(echo ${TRACK_TEMP} | gawk -F '¬' '{ print $1 }')" - - - if [[ "$TRACK" == "0 Return to Main Menu" ]] - then dplayPrompt - elif [[ -z "$TRACK" ]]; then - exit - else - filename=$(echo "$TRACK" | gawk -F "\t" '{print $3}') - info=$(mpc search --format '%artist%\t%album%\t%date%\t%track%\t%title%' filename "${filename}") - artist="$(echo "$info" \ - | gawk -F '\t' '{ print $1 }')" - album="$(echo "$info" \ - | gawk -F '\t' '{ print $2 }')" - date="$(echo "$info" \ - | gawk -F '\t' '{ print $3 }')" - track="$(echo "$info" \ - | gawk -F '\t' '{ print $4 }')" - title="$(echo "$info" \ - | gawk -F '\t' '{ print $5 }')" - - mpc search track "$track" album "$album" title "$title" albumartist "$artist" | clerk_helper saveto - entry="$TRACK" - saveTrackToPlaylist - fi -} - -getAlbumsFromPlaylist () { - current=$(mpc save temp) - pl="clerk" - mpc clear - mpc load "${pl}" - list=$(mpc playlist -f '%artist% - %album% - %date%' | sort -u | _rofi -kb-move-word-forward '' -kb-row-tab '' -dmenu -mesg "${add}: Add, ${insert}: Insert, ${replace}: Replace") - - val=$? - - mpc clear - if [[ $val == 12 ]]; then - mpc searchadd artist "$(echo $list | gawk -F ' - ' '{print $1}')" album "$(echo $list | gawk -F ' - ' '{print $2}')" date "$(echo $list | gawk -F ' - ' '{print $3}')" - mpc play - elif [[ $val == 11 ]]; then - mpc load temp - mpc search artist "$(echo $list | gawk -F ' - ' '{print $1}')" album "$(echo $list | gawk -F ' - ' '{print $2}')" date "$(echo $list | gawk -F ' - ' '{print $3}')" | mpc insert - elif [[ $val == 10 ]]; then - mpc load temp - mpc searchadd artist "$(echo $list | gawk -F ' - ' '{print $1}')" album "$(echo $list | gawk -F ' - ' '{print $2}')" date "$(echo $list | gawk -F ' - ' '{print $3}')" - fi - mpc rm temp -} - -################################################################################ - - - -while :; do - case $1 in - --nextalbum) - skipAlbum next - exit - ;; - --prevalbum) - skipAlbum prev - exit - ;; - --add) - if [[ ! $2 ]]; then - echo "Missing argument for --add" - echo "Possible values: track, album, latest" - elif [[ $2 == track ]]; then - addTrackTags - elif [[ $2 == album ]]; then - addAlbum alphabet - elif [[ $2 == latest ]]; then - addAlbum latest - fi - break - ;; - --rate) - if [[ ! $2 ]]; then - echo "Missing arguemtn for --rate" - echo "Possible values: track, album, instant" - echo "Launching rating menu" - ratingPrompt - elif [[ $2 == track ]]; then - rateTrack - elif [[ $2 == album ]]; then - rateAlbum - elif [[ $2 == instant ]]; then - if [[ ! $3 ]]; then - echo "Missing argument for --rate instant" - echo "Please define rating between 1-10" - else - instantRateTrack $3 - fi - elif [[ $2 == load ]]; then - mpc clear && mpc sticker "" find rating | grep -E "rating=6|rating=7|rating=8|rating=9|rating=10" | gawk -F ':' '{print $1}' | $shuf -n $value | mpc add && mpc play - fi - break - ;; - --random) - if [[ ! $2 ]]; then - echo "Missing argument for --random" - echo "Possible values: track, album" - elif [[ $2 == track ]]; then - playRandomTracks - elif [[ $2 == album ]]; then - playRandomAlbum - fi - break - ;; - --current) - currentTag - break - ;; - --browse) - if [[ ! $2 ]]; then - echo "Missing argument for --browse" - echo "Possible values: artist, date, genre, folder, system" - elif [[ $2 == artist ]]; then - browseArtist - elif [[ $2 == albumartist ]]; then - browseAlbumArtist - elif [[ $2 == date ]]; then - browseDate - elif [[ $2 == genre ]]; then - browseGenre - elif [[ $2 == system ]]; then - browseFilesystem - elif [[ $2 == folder ]]; then - browseFolders - fi - break - ;; - --backup) - if [[ ! $2 ]]; then - echo "Missing argument for --backup" - echo "Possible values: track, album" - elif [[ $2 == track ]]; then - backupTrackRatings - elif [[ $2 == album ]]; then - backupAlbumRatings - fi - break - ;; - --restore) - if [[ ! $2 ]]; then - echo "Missing argument for --restore" - echo "Possible values: track, album" - elif [[ $2 == track ]]; then - restoreTrackRatings - elif [[ $2 == album ]]; then - restoreAlbumRatings - fi - break - ;; - --queue) - if [[ ! $2 ]]; then - echo "Missing argument for --queue" - echo "Possible values: show, delete, suspend, resume" - elif [[ $2 == show ]]; then - dplayQueue - elif [[ $2 == delete ]]; then - dplayQueueDelete - elif [[ $2 == suspend ]]; then - cli=true suspendPlaylist - elif [[ $2 == resume ]]; then - cli=true resumePlaylist - fi - break - ;; - --rss) - loadRSS - break - ;; - --playlist) - if [[ $2 == savealbum ]]; then - saveAlbumToPlaylist - elif [[ $2 == load ]]; then - dplayQueueLoad - elif [[ $2 == savelast ]]; then - saveLatestToPlaylist - elif [[ $2 == savetrack ]]; then - saveTrackToPlaylist - elif [[ $2 == loadalbum ]]; then - getAlbumsFromPlaylist - fi - break - ;; - --lastfm) - if [[ ! $2 ]]; then - echo "Missing argument for --lastfm" - echo "Possible values: toggle, check, love" - elif [[ $2 == toggle ]]; then - lastFM - elif [[ $2 == check ]]; then - lastFMCheck - elif [[ $2 == love ]]; then - if [[ scrobbler=mpdscribble ]]; then - lastfm-mpd-cli love > /dev/null && notify-send "MPD" "Loved $(mpc current -f '%title%') on LastFM" - elif [[ scrobbler=mpdas ]]; then - mpc sendmessage mpdas love - fi - fi - break - ;; - --update) - forceupdate=true updateCache - ;; - --help|-h) - echo "---" - echo "clerk: rofi based MPD Interface" - echo "Copyright © 2013 - 2015 Rasmus Steinke" - echo "---" - echo "General" - echo " --help, -h this help message" - echo " --current show currently playing track" - echo " --update update album/track caches" - echo "" - echo "Library" - echo " --add <track, album, latest> adds selection at the end of the queue" - echo " --random <track, album> play random track or album" - echo "" - echo "Playlist" - echo " --queue <show, suspend, resume> manage current queue" - echo " --playlist <savealbum, savelast, savetrack> save selection to playlist \"clerk\"" - echo " --playlist <load> load playlist" - echo " --rss load podcast" - echo " (podcast should be placed in \$XDG_CONFIG_HOME/clerk/podcasts" - echo " with format NAME \ URL)" - echo "" - echo "Ratings" - echo " --rate <menu, track, album, load, instant ##> rate albums or tracks" - echo " "load" adds random rated tracks to queue" - echo "" - echo " --backup <track, album> backup ratings from mpd sticker database to json file." - echo " --restore <track, album> restore ratings back to mpd sticker database" - echo "" - echo "LastFM" - echo " --lastfm <toggle, check, love> toggle or check last.fm status, love current track" - break - ;; - *) - dplayPrompt ;; - esac - shift -done diff --git a/clerk.pl b/clerk.pl new file mode 100644 index 0000000..b047ea1 --- /dev/null +++ b/clerk.pl @@ -0,0 +1,199 @@ +#!/usr/bin/env perl + +use Net::MPD; +use v5.10; +use File::stat; +use Data::Dumper; +use warnings; +use IO::Select; +use File::Basename; +use strict; +use IPC::Run qw( timeout start ); +use autodie; +use utf8; +use File::Slurper 'read_binary'; +binmode(STDOUT, ":utf8"); +use Data::MessagePack; +use Config::Simple; + +my $config_file = $ENV{'HOME'} . "/.config/clerk/clerk.conf"; + +# read configuration file +my $cfg = new Config::Simple(filename=>"$config_file"); + +my $general_cfg = $cfg->param(-block=>"General"); +my $mpd_host = $general_cfg->{mpd_host}; +my $db_file = $general_cfg->{database}; +my $backend = $general_cfg->{backend}; + +my $columns_cfg = $cfg->param(-block=>"Columns"); +my $albumartist_l = $columns_cfg->{albumartist_l}; +my $album_l = $columns_cfg->{album_l}; +my $date_l = $columns_cfg->{date_l}; +my $title_l = $columns_cfg->{title_l}; +my $track_l = $columns_cfg->{track_l}; +my $artist_l = $columns_cfg->{artist_l}; + + +# open connection to MPD +my $mpd = Net::MPD->connect($ENV{MPD_HOST} // $mpd_host // 'localhost'); + +sub main { + create_db(); + list_albums(); +} + + +sub create_db { + # Get database copy and save as messagepack file, if file is either missing + # or older than latest mpd database update. + # get number of songs to calculate number of searches needed to copy mpd database + my $mpd_stats = $mpd->stats(); + my $songcount = $mpd_stats->{songs}; + my $last_update = $mpd_stats->{db_update}; + + if (!-f "$db_file" || stat("$db_file")->mtime < $last_update) { + print STDERR "::: MPD database copy missing or out of date\n"; + print STDERR "::: Starting database sync\n"; + print STDERR "::: Songs in database: $songcount\n"; + my $times = int($songcount / 1000 + 1); + print STDERR "==> Requesting $times chunks from MPD\n"; + my @db; + # since mpd will silently fail, if response is larger than command buffer, let's split the search. + my $chunk_size = 1000; + for (my $i=0;$i<=$songcount;$i+=$chunk_size) { + my $endnumber = $i+$chunk_size; + my @temp_db = $mpd->search('filename', '', 'window', "$i:$endnumber"); + push @db, @temp_db; + } + + # only save relevant tags to keep messagepack file small + # note: maybe use a proper database instead? See list_album function. + my @filtered = map { {$_->%{'Album', 'Artist', 'Date', 'AlbumArtist', 'Title', 'Track', 'uri', 'Last-Modified'}} } @db; + pack_msgpack(\@filtered); + } + print STDERR "::: MPD database copy up to date\n"; +} + +# sub backend_call { +# my ($in) = @_; +# my $input = join "", (@{$in}); +# my $out; +# my %backends = ( +# fzf => [ qw(fzf --reverse --no-sort -m -e -i --with-nth=1,2,3 -d "\t" --tabstop=4 +s --ansi --expect=alt-v,alt-b) ], +# rofi => [qw(rofi -dmenu -width 1800)]); +# my $handle = run (($backends{$backend} // die('backend not found')), \$input, \$out) or die('No selection'); +# +# return $out; +# } + +sub backend_call { + my ($in) = @_; + my $input; + my $out; + my %backends = ( fzf => [ qw(fzf --reverse --no-sort -m -e -i --with-nth=1,2,3 -d "\t" --tabstop=4 +s --ansi) ], rofi => ['rofi', '-width', '1300', '-dmenu', '-i', '-p', '> ']); + my $handle = start $backends{$backend} // die('backend not found'), \$input, \$out; + $input = join "", (@{$in}); + finish $handle or die "No selection"; + return $out; +} + +sub pack_msgpack { + my ($filtered_db) = @_; + my $msg = Data::MessagePack->pack($filtered_db); + my $filename = "$db_file"; + open(my $out, '>:raw', $filename) or die "Could not open file '$filename' $!"; + print $out $msg; + close $out; +} + +sub unpack_msgpack { + my $mp = Data::MessagePack->new->utf8(); + my $msgpack = read_binary("$db_file"); + my $rdb = $mp->unpack($msgpack); + return $rdb; +} + +# read messagepack file and output strings +sub list_albums { + print STDERR "::: Creating list of albums\n"; + my $rdb = unpack_msgpack(); + my @album_db = do {my %seen; grep { !defined($_->{AlbumArtist}) or !defined($_->{Album}) or + !defined($_->{Date}) or !$seen{$_->{AlbumArtist}}{$_->{Album}}{$_->{Date}}++ } @{$rdb}}; + my @sorted_db = sort { lc($a->{AlbumArtist}) cmp lc($b->{AlbumArtist}) } @album_db; + + # push list to rofi and receive selected item + my @output; + my $in; + for my $entry (@sorted_db) { + my $album_dir = dirname($entry->{uri}); + $album_dir =~ s/\/CD.*$//g; + $in = sprintf "%-${albumartist_l}.${albumartist_l}s\t%-${date_l}.${date_l}s\t%-${album_l}.${album_l}s\t%s\n", $entry->{AlbumArtist},$entry->{Date}, $entry->{Album}, $album_dir; + push @output, $in; + } + my $out = backend_call(\@output); + print $out; + # call rofi function to display possible actions + my @action_items = ("Add\n", "Insert\n", "Replace\n"); + my $action = backend_call(\@action_items); + + # split output into tag variables and remove possible whitespace + if ($action eq "Add\n") { + my $line; + foreach my $line (split /\n/, $out) { + my $uri = (split /[\t\n]/, $line)[-1]; + my ($artist, $date, $album) = map { s/\s+$//r } split /[\t\n]/, $line; + print STDERR "::: Selected album \"$album\" from \"$artist\" released in $date\n"; + print STDERR "==> Adding selected album(s) to current playlist\n"; + $mpd->add($uri); + } + } + elsif ($action eq "Replace\n") { + my $uri = (split /[\t\n]/, $out)[-1]; + my ($artist, $date, $album) = map { s/\s+$//r } split /[\t\n]/, $out; + print STDERR "==> Replacing current playlist with selected album(s)\n"; + $mpd->clear(); + $mpd->search_add('Artist' => $artist, 'Album' => $album, 'Date' => $date); + $mpd->play(); + } + list_albums(); +} + +sub list_tracks { + print STDERR "::: Creating list of tracks\n"; + my $rdb = unpack_msgpack(); + my @output; + my $in; + for my $entry (@{$rdb}) { + $in = sprintf "%-${track_l}.${track_l}s\t%-${title_l}.${title_l}s\t%-${artist_l}.${artist_l}s\t%-${album_l}.${album_l}s\t%-s\n", $entry->{Track},$entry->{Title}, $entry->{Artist}, $entry->{Album}, $entry->{uri}; + push @output, $in; + } + my $out = backend_call(\@output); + my $uri = (split /[\t\n]/, $out)[-1]; + my $songinfo = $mpd->search('filename' => $uri); + + my $artist=$songinfo->{Artist}; + my $album=$songinfo->{Album}; + my $title=$songinfo->{Title}; + my $track=$songinfo->{Track}; + my $date=$songinfo->{Date}; + print "::: Selected \"$title\" from artist \"$artist\" of album \"$album\"\n"; + + my @action_items = ("Add\n", "Insert\n", "Replace\n"); + my $action = backend_call(\@action_items); + + if ($action eq "Add\n") { + print "debug test text"; + print STDERR "==> Adding selected track to current playlist\n"; + $mpd->search_add('Artist' => $artist, 'Album' => $album, 'Title' => $title, 'Date' => $date); + } + elsif ($action eq "Replace\n") { + print STDERR "==> Replacing current playlist with selected track\n"; + $mpd->clear(); + $mpd->search_add('Artist' => $artist, 'Album' => $album, 'Title' => $title, 'Date' => $date); + $mpd->play(); + } +} + + +main; diff --git a/clerk_fzf/Makefile b/clerk_fzf/Makefile deleted file mode 100644 index f2f7abc..0000000 --- a/clerk_fzf/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -ifndef PREFIX - PREFIX=/usr/local -endif - -install: - install -Dm755 clerk_fzf $(DESTDIR)$(PREFIX)/bin/clerk_fzf - install -Dm644 tmux.clerk $(DESTDIR)/etc/clerk/tmux.conf - install -Dm644 clerk_fzf.conf $(DESTDIR)/etc/clerk_fzf.conf - diff --git a/clerk_fzf/clerk_fzf b/clerk_fzf/clerk_fzf deleted file mode 100755 index 81f53c7..0000000 --- a/clerk_fzf/clerk_fzf +++ /dev/null @@ -1,381 +0,0 @@ -#!/usr/bin/env bash - -TMUX_TMPDIR="/tmp/clerk/tmux" - -# default tmux config -tmux_config="/etc/clerk/tmux.conf" - -# set default settings -script="$0 $1" -random_artist="albumartist" -shuf=$([[ "$OSTYPE" == "darwin"* ]] && echo 'gshuf' || echo 'shuf') -value=20 -# table customization -track_width="2" -title_width="40" -artist_width="50" -date_width="6" -# album is much longer in order to keep filename off screen -album_width="200" -pl_title_width="110" - -# read global config -if [[ -f "/etc/clerk_fzf.conf" ]]; then - source /etc/clerk_fzf.conf -fi - -# create config dir, if needed -if [[ ! -d $HOME/.config/clerk ]]; then - mkdir $HOME/.config/clerk -fi - -# read user config -if [[ -f "$HOME/.config/clerk/clerk_fzf.conf" ]]; then - source $HOME/.config/clerk/clerk_fzf.conf -fi - -if [[ -n $mpd_host ]]; then - if [[ -n $mpd_password ]]; then - export MPD_HOST="${mpd_password}@${mpd_host}" - else - export MPD_HOST="${mpd_host}" - fi -fi - -if [[ -n $mpd_port ]]; then - ┆ export MPD_PORT="${mpd_port}" -fi - - -date=$(mpc stats | grep 'DB Updated: ') -file="$HOME/.config/clerk/.lastupdate" -if [ "$(< $file)" = "$date" ] && [ -f "$file" ] ; then - : -else - updateCache - date=$(mpc stats | grep 'DB Updated: ') - echo "${date}" > "${file}" -fi - -albums () { - script="$0 --albums" - tracklist="$(cat ~/.config/clerk/albums.cache | fzf --no-sort -m -e --reverse -i --with-nth=1,2,3 -d '\t' --tabstop=4 +s --ansi --bind "ctrl-a:select-all,ctrl-n:deselect-all")" - val=$? - if [[ $val -eq 130 ]]; then - albums - fi - track="$(echo "${tracklist}" | gawk -F "\t" '{print $NF}')" - actions -} - -latest () { - script="$0 --latest" - tracklist=$(cat ~/.config/clerk/latest.cache | fzf --no-sort -m -e --reverse -i --with-nth=1,2,3 -d '\t' --tabstop=4 +s --ansi --bind "ctrl-a:select-all,ctrl-n:deselect-all") - val=$? - if [[ $val -eq 130 ]]; then - latest - fi - track="$(echo "${tracklist}" | gawk -F "\t" '{print $NF}')" - actions -} - -tracks () { - script="$0 --tracks" - tracklist=$(cat ~/.config/clerk/tracks.cache | fzf -m --reverse -i -e --with-nth=1,2,3,4,5 -d '\t' --tabstop=4 +s --ansi --bind "ctrl-a:select-all,ctrl-n:deselect-all") - val=$? - if [[ $val -eq 130 ]]; then - tracks - fi - if [[ $tracklist == "< Go to Albumlist"* ]]; then - latest - fi - track="$(echo "${tracklist}" | gawk -F "\t" '{print $NF}')" - actions -} - -actions () { - action=$(echo -e "1. Replace\n2. Add\n3. Insert" | fzf --reverse -i --header="Choose Action or quit with ESC" --inline-info) - - if [[ $action == "1. Replace" ]]; then - mpc clear > /dev/null - echo "${track}" | while read line; do - mpc add "${line}" > /dev/null - done - mpc play > /dev/null - elif [[ $action == "2. Add" ]]; then - echo "${track}" | while read line; do - mpc add "${line}" > /dev/null - done - elif [[ $action == "3. Insert" ]]; then - echo "${track}" | while read line; do - mpc insert "${line}" > /dev/null - done - elif [[ $action -eq 130 ]]; then - exit - fi - tmux findw -t music queue - $(${script}) -} - -playRandomAlbum () { - mpc clear > /dev/null - artist="$(mpc list "albumartist" | $shuf -n 1)" - album="$(mpc list album "albumartist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "albumartist" "$artist" > /dev/null; - mpc play > /dev/null - tmux findw -t music queue -} - -# same for tracks, no artist should be preferred because it has more tracks. -playRandomTracks () { - mpc clear > /dev/null - artist="$(mpc list "$random_artist" | $shuf -n 1)" - album="$(mpc list album "$random_artist" "$artist" | $shuf -n 1)" - title="$(mpc list title album "$album" "$random_artist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "$random_artist" "$artist" title "$title" > /dev/null - mpc play > /dev/null - - n=0; while (( n++ < $value -1 )); do - artist="$(mpc list "$random_artist" | $shuf -n 1)" - album="$(mpc list album "$random_artist" "$artist" | $shuf -n 1)" - title="$(mpc list title album "$album" "$random_artist" "$artist" | $shuf -n 1)" - mpc findadd album "$album" "$random_artist" "$artist" title "$title" > /dev/null - done - mpc play > /dev/null - tmux findw -t music queue -} - -fix_date_format() { - # provided by Thorsten Wißmann: - # https://github.com/t-wissmann/dotfiles/blob/master/menu/rofi-mpd.sh - # reformats the date given in column $1 from format %c of locale LC_TIME=C - # (see man strftime) to the format specified in argument $2 column indices - # start with 1 - column_index="$1" - gawk -F $'\t' ' - # parse a date which was formated using %c to unix time - BEGIN { - # generated by the following bash one-liner: - # for i in {1..12} ; do LC_TIME=C date -d "1972-$i-01" +month2num[\"%b\"]\ =\ %_m ; done - month2num["Jan"] = 1 - month2num["Feb"] = 2 - month2num["Mar"] = 3 - month2num["Apr"] = 4 - month2num["May"] = 5 - month2num["Jun"] = 6 - month2num["Jul"] = 7 - month2num["Aug"] = 8 - month2num["Sep"] = 9 - month2num["Oct"] = 10 - month2num["Nov"] = 11 - month2num["Dec"] = 12 - } - function reformat_c_date(str) { - monthname = gensub(/^([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)$/, "\\2", "g", str) - monthnum = month2num[monthname] - nicedate = gensub(/^([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)[ ]+([^ ]*)$/, "\\5 " monthnum " \\3 \\4", "g", str) - nicedate = gensub(/:/, " ", "g", nicedate) - return nicedate - } - { - # modify the $column_index-th field - $'"$1"' = strftime("'"$2"'", mktime(reformat_c_date($'"$1"'))) - print $0 - } - ' -} - -updateCache () { - notify-send "clerk" "updating cache files" - cd $HOME/.config/clerk - rm -f *.cache - - mpc --format '%mtime%\t[%albumartist%|%artist%] ○ (%date%) ○ %album% [(CD %disc%)] ○ %file%' \ - search filename '' \ - | fix_date_format 1 '%Y-%m-%d-%H:%M:%S' \ - | sort -nr \ - | gawk '{for (i=2; i<NF; i++) printf $i " "; print $NF }' \ - | perl -ne 'print unless $seen{$_}++' \ - | sed 's:/[^/]*$::' | awk -F ' ○ ' '!seen[$1 $2 $3 $4]++' \ - | uniq \ - | gawk -F ' ○ ' '{ printf "%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.300s\n", $1, $2, $3, $4 }' \ - > $HOME/.config/clerk/latest.cache - mpc --format '[%albumartist%|%artist%]\t(%date%)\t%album% [(CD %disc%)]\t%file%' \ - search filename '' \ - | sed 's:/[^/]*$::' \ - | awk -F '\t' '!seen[$1 $2 $3 $4]++' \ - | sort \ - | gawk -F '\t' '{ printf "%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.300s\n", $1, $2, $3, $4 }' \ - > $HOME/.config/clerk/albums.cache - mpc --format '%track%\t%title%\t%artist%\t(%date%)\t%album%\t%file%' \ - search filename '' \ - | gawk -F '\t' '{ printf "%-"'${track_width}'"."'${track_width}'"s\t%-"'${title_width}'"."'${title_width}'"s\t%-"'${artist_width}'"."'${artist_width}'"s\t%-"'${date_width}'"."'${date_width}'"s\t%-"'${album_width}'"."'${album_width}'"s\t%.500s\n", $1, $2, $3, $4, $5, $6 }' \ - > $HOME/.config/clerk/tracks.cache - notify-send "clerk" "finished updating cache files" - date=$(mpc stats | grep 'DB Updated: ') - file="$HOME/.config/clerk/.lastupdate" - echo "${date}" > "${file}" -# | gawk -F '\t' '{ printf "%.2s\t%.40s\t%.40s\t%.200s\t%.500s\n", $1, $2, $3, $4, $5, $6 }' \ - if [[ $forceupdate == "true" ]]; then - exit - fi -} - -clerk_update () { -screen=$(tmux list-panes -F "#W") - -if [[ $1 == "--create-caches" ]]; then - if [[ $animation == "1" ]]; then - tmux new-session -s notify -n 'Updating Cache Files. Please wait a moment' -d 'sl' - else - tmux new-session -s notify -n 'Updating Cache Files. Please wait a moment' -d 'sh' - fi - tmux switchc -t notify - clerk_fzf --caches & - pid=$! - wait $pid -fi - -tmux new-session -s music2 -n albums -d 'clerk_fzf --albums' -tmux new-window -t music2 -n tracks 'clerk_fzf --tracks' -tmux new-window -t music2 -n latest 'clerk_fzf --latest' -tmux new-window -t music2 -n playlists 'clerk_fzf --playlists' -tmux new-window -t music2 -n queue "${player}" - -tmux rename-session -t music music_old -tmux rename-session -t music2 music -tmux switchc -t music -tmux findw -t music ${screen} -tmux kill-session -t music_old - -if [[ $1 == "--create-caches" ]]; then - tmux kill-session -t notify -fi -} - -playlists () { - pls=( - "$(mpc lsplaylists)" - "---" - "Save current Queue as Playlist") - - - plsmenu="$(printf '%s\n' "${pls[@]}" | fzf --no-sort -m -e --reverse -i --ansi --bind "ctrl-a:select-all,ctrl-n:deselect-all")" - val=$? - if [[ $val -eq 130 ]]; then - playlists - fi - if [[ $plsmenu == "Save current Queue as Playlist" ]]; then - mpc save "$(date +'%Y-%m-%d_%H:%M:%S')" - tmux findw -t music queue - $(${script}) - else - playlistactions - fi -} - -playlistactions () { - menu_content=("Load Playlist" - "Append Playlist" - "Delete Playlist" - "Cancel") - - plmenu="$(printf '%s\n' "${menu_content[@]}" | fzf -m -e --reverse -i --ansi)" - - if [[ $val -eq 130 ]] - then - tmux findw -t playlists - fi - - case $plmenu in - "Load Playlist") - mpc clear > /dev/null; mpc load "${plsmenu}" > /dev/null; mpc play > /dev/null - tmux findw -t music queue - $(${script}) - ;; - "Add Playlist") - mpc load "${plsmenu}" > /dev/null - tmux findw -t music queue - $(${script}) - ;; - "Delete Playlist") - del_content=("Yes" - "No") - - delmenu="$(printf '%s\n' "${del_content[@]}" | fzf --reverse -i --ansi --header="Delete Playlist ${plsmenu}?")" - - case $delmenu in - "Yes") - mpc rm "${plsmenu}" - playlists - ;; - "No") - playlists - ;; - esac - ;; - "Cancel") - playlists - ;; - esac -} - -clerk_help () { - grep -A14 '^## Key Bindings' "${tmux_config}" | awk -F '-n ' '{ print $2 }' | \ - sed 's/clerk_fzf --//g; s/run-shell//g; s/findw//g; s/\x27//g; s/--quiet//g; s/mpc //g; s/clerk_update --create-caches/create caches/; s/_/ /g; s/kill-session -t music/ kill session/g; s/ /\t/g' | \ - sed 's/clerk update/update views/' | column -t -s $'\t' -} - - - -tmux_config="/etc/clerk/tmux.conf" - -# read global config -if [[ -f "/etc/clerk_fzf.conf" ]]; then - source /etc/clerk_fzf.conf -fi - -clerk_start () { -export TMUX_TMPDIR="/tmp/clerk/tmux" - -if [[ ! -d "${TMUX_TMPDIR}" ]]; then - mkdir -p "${TMUX_TMPDIR}" -fi -main -} - -main() { - tmux has-session -t music - if [ $? != 0 ]; then - tmux -f "${tmux_config}" new-session -s music -n albums -d 'clerk_fzf --albums' - tmux new-window -t music -n tracks 'clerk_fzf --tracks' - tmux new-window -t music -n latest 'clerk_fzf --latest' - tmux new-window -t music -n playlists 'clerk_fzf --playlists' - tmux new-window -t music -n queue "${player}" - fi - tmux attach -t music -} - -helpCmd () { - cat <<'EOF' -clerk: MPD Interface using fzf and tmux -Copyright © 2016 Rasmus Steinke - ---help, -h this help message ---kill kill running clerk sessions -EOF -} - -case $1 in - "--help | -h") helpCmd;; - "--kill") tmux kill-session -t music;; - "--albums") albums;; - "--tracks") tracks;; - "--latest") latest;; - "--random_album") playRandomAlbum;; - "--random_tracks") playRandomTracks;; - "--help") clerk_help;; - "--caches") updateCache;; - "--playlists") playlists;; - *) clerk_start -esac diff --git a/clerk_fzf/clerk_fzf.conf b/clerk_fzf/clerk_fzf.conf deleted file mode 100644 index 8188721..0000000 --- a/clerk_fzf/clerk_fzf.conf +++ /dev/null @@ -1,35 +0,0 @@ -#!/usr/bin/env bash - -# always use the provided tmux config to change values -# especially make sure, the Bindings section is complete -# tmux config to use -tmux_config="/etc/clerk/tmux.conf" - -# custom mpd host -mpd_host= -mpd_port= -mpd_password= - - -script="$0 $1" -random_artist="albumartist" -shuf=$([[ "$OSTYPE" == "darwin"* ]] && echo 'gshuf' || echo 'shuf') - -# number of tracks to add for random songs -value=20 - -# table customization -track_width="2" -title_width="40" -artist_width="50" -date_width="6" -pl_title_width="110" - -# album is much longer in order to keep filename off screen -album_width="200" - -# player used for queue -player=ncmpcpp - -# animate updates -animation=1 diff --git a/clerk_fzf/tmux.clerk b/clerk_fzf/tmux.clerk deleted file mode 100644 index 9081e2a..0000000 --- a/clerk_fzf/tmux.clerk +++ /dev/null @@ -1,54 +0,0 @@ -# Status bar -set-option -g status-position top -set -g status-interval 30 -set -g status-justify centre -set -g status-left-length 40 -set -g status-left '' -set -g status-right '' - - -# Colors -set -g status-bg colour235 -set -g status-fg default -setw -g window-status-current-bg default -setw -g window-status-current-fg default -setw -g window-status-current-attr dim -setw -g window-status-bg default -setw -g window-status-fg white -setw -g window-status-attr bright -setw -g window-status-format ' #[fg=colour243,bold]#W ' -setw -g window-status-current-format ' #[fg=yellow,bold]#[bg=colour235]#W ' - -# !Dont remove this keybinding header! (used to generate help) -## Key Bindings -bind-key -n F1 findw albums -bind-key -n F2 findw tracks -bind-key -n F3 findw latest -bind-key -n F4 findw playlists -bind-key -n F5 findw queue -bind-key -n C-F5 run-shell 'mpc prev --quiet' -bind-key -n C-F6 run-shell 'mpc toggle --quiet' -bind-key -n C-F7 run-shell 'mpc stop > /dev/null' -bind-key -n C-F8 run-shell 'mpc next --quiet' -bind-key -n C-F12 run-shell 'forceupdate="true" clerk_fzf --update' -bind-key -n F12 run-shell 'clerk_fzf --update' -bind-key -n F9 run-shell 'clerk_fzf --random_album' -bind-key -n F10 run-shell 'clerk_fzf --random_tracks' -bind-key -n C-h run-shell 'clerk_fzf --help' -bind-key -n C-q kill-session -t music - - -# tmux options -set -g set-titles on -set -g set-titles-string '#T' -set -g default-terminal "screen-256color" -setw -g mode-keys vi -set -sg escape-time 1 -set -g repeat-time 1000 -set -g base-index 1 -setw -g pane-base-index 1 -set -g renumber-windows on -unbind C-b -set -g prefix C-a -unbind C-p -bind C-p paste-buffer diff --git a/clerk_helper b/clerk_helper deleted file mode 100755 index 4418cb6..0000000 --- a/clerk_helper +++ /dev/null @@ -1,366 +0,0 @@ -#!/usr/bin/env python3 - -import sys -import os -import json -import argparse -from mpd import MPDClient - -client = MPDClient() - -mpd_host = 'localhost' -mpd_port = '6600' -mpd_pass = '' - -if 'MPD_HOST' in os.environ: - mpd_connection = os.environ['MPD_HOST'].split('@') - if len(mpd_connection) == 1: - mpd_host = mpd_connection[0] - elif len(mpd_connection) == 2: - mpd_host = mpd_connection[1] - mpd_pass = mpd_connection[0] - else: - print('Unable to parse MPD_HOST, using defaults') - -if 'MPD_PORT' in os.environ: - mpd_port = os.environ['MPD_PORT'] - -client.connect(mpd_host, mpd_port) -if mpd_pass: - client.password(mpd_pass) - - -def track_sort(track_num): - if track_num == '': - return 0 - else: - return int(track_num.split('/')[0]) - - -def loadjson(fname): - with open(fname) as data_file: - data = json.load(data_file) - return data - -def extract_key(entry): - return entry["albumartist"] + entry["album"] + entry["date"] - -def hashdata(jdata): - hashmap = {} - for i in range(len(jdata)): - key = extract_key(jdata[i]) - hashmap[key] = i - return hashmap - -def has_entry(fastlist, albumartist, album, date): - key = albumartist+album+date - if key in fastlist[1]: - return True - else: - return False - -def get_entry(fastlist, albumartist, album, date): - return fastlist[0][fastlist[1][albumartist+album+date]] - -def load_fastlist(fname): - jdata = loadjson(fname) - hdata = hashdata(jdata) - return (jdata, hdata) - -def save_fastlist(fname, fastlist): - with open(fname, "w") as data_file: - json.dump(fastlist[0], data_file, ensure_ascii=False) - -def append_entry(fastlist, entry): - index = len(fastlist[0]) - fastlist[0].append(entry) - fastlist[1][extract_key(entry)] = index - -def prune_fastlist(fastlist, mpdcachefile): - mpdlist = loadjson(mpdcachefile) - data = fastlist[0] - new = [] - for e in mpdlist: - key = (e["albumartist"], e["album"], e["date"]) - if has_entry(fastlist, *key): - entry = get_entry(fastlist, *key) - new.append(entry) - newhdata = hashdata(new) - return (new, newhdata) - -def rateAlbum(args): - try: - fastlist = load_fastlist(os.getenv('db_rate_album')) - entry = get_entry(fastlist, args.artist, args.album, args.date) - entry["rating"] = args.rating - except KeyError: - entry = {'albumartist': args.artist, 'album': args.album, 'date': args.date, 'disc': os.getenv('disc'), 'track': os.getenv('track'), 'rating': args.rating} - append_entry(fastlist, entry) - except FileNotFoundError: - fastlist = ([], {}) - entry = {'albumartist': args.artist, 'album': args.album, 'date': args.date, 'disc': os.getenv('disc'), 'track': os.getenv('track'), 'rating': args.rating} - fastlist[0].append(entry) - finally: - save_fastlist(os.getenv('db_rate_album'), fastlist) - uri = client.find('albumartist', args.artist, 'album', args.album, 'date', args.date, 'track', os.getenv('track'), 'disc', os.getenv('disc')) - for i in uri: - client.sticker_set("song", i['file'], "albumrating", args.rating) - - - -def loadjsonTrack(fname): - with open(fname) as data_file: - data = json.load(data_file) - return data - -def extract_keyTrack(entry): - return entry["artist"] + entry["album"] + entry["track"] + entry["title"] - -def hashdataTrack(jdata): - hashmap = {} - for i in range(len(jdata)): - key = extract_keyTrack(jdata[i]) - hashmap[key] = i - return hashmap - -def has_entryTrack(fastlist, artist, album, track, title): - key = artist+album+track+title - if key in fastlist[1]: - return True - else: - return False - -def get_entryTrack(fastlist, artist, album, track, title): - return fastlist[0][fastlist[1][artist+album+track+title]] - -def load_fastlistTrack(fname): - jdata = loadjsonTrack(fname) - hdata = hashdataTrack(jdata) - return (jdata, hdata) - -def save_fastlistTrack(fname, fastlist): - with open(fname, "w") as data_file: - json.dump(fastlist[0], data_file, ensure_ascii=False) - -def append_entryTrack(fastlist, entry): - index = len(fastlist[0]) - fastlist[0].append(entry) - fastlist[1][extract_keyTrack(entry)] = index - -def prune_fastlistTrack(fastlist, mpdcachefile): - mpdlist = loadjsonTrack(mpdcachefile) - data = fastlist[0] - new = [] - for e in mpdlist: - key = (e["artist"], e["album"], e["track"], e["title"]) - if has_entryTrack(fastlist, *key): - entry = get_entryTrack(fastlist, *key) - new.append(entry) - newhdata = hashdataTrack(new) - return (new, newhdata) - -def rateTrack(args): - """ rate a single track: create/update json track database and update mpd - sticker database - """ - try: - fastlist = load_fastlistTrack(os.getenv('db_rate_track')) - entry = get_entryTrack(fastlist, args.artist, args.album, args.track, args.title) - entry["rating"] = args.rating - except KeyError: - entry = {'artist': args.artist, 'album': args.album, 'track': args.track, 'title': args.title, 'rating': args.rating} - append_entryTrack(fastlist, entry) - except FileNotFoundError: - fastlist = ([], {}) - entry = {'artist': args.artist, 'album': args.album, 'track': args.track, 'title': args.title, 'rating': args.rating} - fastlist[0].append(entry) - finally: - save_fastlistTrack(os.getenv('db_rate_track'), fastlist) - uri = client.find('artist', args.artist, 'album', args.album, 'track', args.track, 'title', args.title) - for i in uri: - client.sticker_set("song", i['file'], "rating", args.rating) - - - -def cleanRatings(args): - fastlist = load_fastlist(os.getenv('db_rate_album')) - prunedlist = prune_fastlist(fastlist, os.getenv('cache_album')+'.json') - save_fastlist(os.getenv('db_rate_album'), prunedlist) - fastlist = load_fastlistTrack(os.getenv('db_rate_track')) - prunedlist = prune_fastlistTrack(fastlist, os.getenv('cache_track')+'.json') - save_fastlistTrack(os.getenv('db_rate_track'), prunedlist) - - -def importTrackRatings(args): - tracklist = client.sticker_find('song', "", 'rating') - rated_tracks = [] - for i in tracklist: - rating_temp = i['sticker'] - rating = rating_temp.split('=')[1] - for x in client.find('file', i['file']): - artist = x['artist'] - title = x['title'] - album = x['album'] - if isinstance(x['track'], list): - track = x['track'][0] - else: - track = x['track'] - entry = {'artist': artist, 'album': album, 'track': track, 'title': title, 'rating': rating} - rated_tracks.append(entry) - with open(os.getenv('db_rate_track'), 'w') as ratingfile: - json.dump(rated_tracks, ratingfile) - -def importAlbumRatings(args): - ratelist = client.sticker_find('song', "", 'albumrating') - rated_tracks = [] - for i in ratelist: - rating_temp = i['sticker'] - rating = rating_temp.split('=')[1] - for x in client.find('file', i['file']): - artist = x['albumartist'] - album = x['album'] - date = x['date'] - if isinstance(x['track'], list): - track = x['track'][0] - else: - track = x['track'] - if 'disc' in x: - if isinstance(x['disc'], list): - disc = x['disc'][0] - else: - disc = x['disc'] - else: - disc = "" - entry = {'albumartist': artist, 'track': track, 'album': album, 'date': date, 'disc': disc, 'rating': rating} - rated_tracks.append(entry) - with open(os.getenv('db_rate_album'), 'w') as ratingfile: - json.dump(rated_tracks, ratingfile) - -def sendStickers(args): - with open(os.getenv('db_rate_track')) as cache_file: - content = json.load(cache_file) - for track in content: - uri = client.find('artist', track['artist'], 'album', track['album'], 'title', track['title'], 'track', track['track']) - rating = track['rating'] - for x in uri: - client.sticker_set('song', x['file'], 'rating', rating) - print("Imported Rating of "+rating+" for file "+x['file']) - - with open(os.getenv('db_rate_album')) as cache_file: - content = json.load(cache_file) - for album in content: - uri = client.find('albumartist', album['albumartist'], 'album', album['album'], 'disc', album['disc'], 'date', album['date'], 'track', album['track']) - rating = album['rating'] - for x in uri: - client.sticker_set('song', x['file'], 'albumrating', rating) - print("Imported Rating of "+rating+" for album "+album['albumartist']+" - "+album['album']) - - -def getAlbumRatings(args): - ratings = client.sticker_find('song', '', 'albumrating') - albumlist = [] - for x in ratings: - rating = x['sticker'] - albums = client.find('file', x['file']) - for album in albums: - entry = {'albumartist': album['albumartist'], 'date': album['date'], 'album': album['album'], 'track': album['track'], 'rating': rating} - print(entry['albumartist']+os.getenv('separator')+entry['date']+os.getenv('separator')+entry['album']+os.getenv('separator')+entry['rating']) - - -def readComments(args): - args = vars(args) - - comments = (client.readcomments(sys.stdin.read()[:-1])) - for key, value in sorted(comments.items()): - print('%s : %s' % (key, value)) - -def prioSong(args): - for line in sys.stdin.read().splitlines(): - client.prio(255, line) - - -def savetoPlaylist(args): - for line in sys.stdin: - if line.strip(): - line = line.strip() - client.playlistadd("clerk", line) -# print(line, end="") - -def getArtistAlbums(args): - albums=client.find('artist', args.artist) - albumlist=[] - for album in albums: - albumlist.append(album['date']+os.getenv('separator')+album['album']) - uni=set(albumlist) - result = list(uni) - sorted_results = sorted(result) - for x in sorted_results: - print("(Album) "+x) - -def getArtistTracks(args): - tracks=client.find('artist', args.artist) - tracklist=[] - for track in tracks: - entry = {'track': track['track'], 'title': track['title']} - tracklist.append(entry) - for x in tracklist: - print("(Song) "+x['track']+os.getenv('separator')+x['title']) - -# create commandline arguments -parser = argparse.ArgumentParser(prog='clerk_helper', description='Companion script for clerk') -subparsers = parser.add_subparsers() - -parser_prio = subparsers.add_parser('prio', help="prioritize song") -parser_prio.set_defaults(call=prioSong) - -parser_readcomments = subparsers.add_parser('readcomments', help="show all tags of current song") -parser_readcomments.set_defaults(call=readComments) - -parser_saveto = subparsers.add_parser('saveto', help="save stdin to playlist \"clerk\"") -parser_saveto.set_defaults(call=savetoPlaylist) - -parser_ratealbum = subparsers.add_parser('ratealbum', help="rate current Album") -parser_ratealbum.add_argument('artist', action="store") -parser_ratealbum.add_argument('album', action="store") -parser_ratealbum.add_argument('date', action="store") -parser_ratealbum.add_argument('rating', action="store") -parser_ratealbum.set_defaults(call=rateAlbum) - -parser_ratetrack = subparsers.add_parser('ratetrack', help="rate current Track") -parser_ratetrack.add_argument('artist', action="store") -parser_ratetrack.add_argument('album', action="store") -parser_ratetrack.add_argument('track', action="store") -parser_ratetrack.add_argument('title', action="store") -parser_ratetrack.add_argument('rating', action="store") -parser_ratetrack.set_defaults(call=rateTrack) - -parser_cleanratings = subparsers.add_parser('cleanratings', help="Clean up Ratings file.") -parser_cleanratings.set_defaults(call=cleanRatings) - -parser_importtrackratings = subparsers.add_parser('importtrackratings', help="Import track ratings from mpd stickers") -parser_importtrackratings.set_defaults(call=importTrackRatings) - -parser_importalbumratings = subparsers.add_parser('importalbumratings', help="Import album ratings from mpd stickers") -parser_importalbumratings.set_defaults(call=importAlbumRatings) - -parser_sendstickers = subparsers.add_parser('sendstickers', help="Send clerk ratings to mpd") -parser_sendstickers.set_defaults(call=sendStickers) - -parser_getalbumratings = subparsers.add_parser('getalbumratings', help="Print Album Ratings") -parser_getalbumratings.set_defaults(call=getAlbumRatings) - -parser_getartistalbums = subparsers.add_parser('getartistalbums', help="Print all albums by Artist") -parser_getartistalbums.add_argument('artist', action="store") -parser_getartistalbums.set_defaults(call=getArtistAlbums) - -parser_getartisttracks = subparsers.add_parser('getartisttracks', help="Print all tracks by Artist") -parser_getartisttracks.add_argument('artist', action="store") -parser_getartisttracks.set_defaults(call=getArtistTracks) - -# parse arguments (thanks jat) -args = parser.parse_args() - -try: - args.call(args) -except AttributeError: - print("No arguments given. Try clerk_helper -h") diff --git a/completion/_clerk b/completion/_clerk deleted file mode 100644 index b7282b7..0000000 --- a/completion/_clerk +++ /dev/null @@ -1,112 +0,0 @@ -#compdef clerk - -local curcontext="$curcontext" state line ret=1 -typeset -A opt_args - -_arguments \ - '1: :->option'\ - '*: :->args' && ret=0 - -case $state in - option) - _arguments -S \ - "-h[output help message]" \ - "--help[output help message]" \ - "--current[show currently playing track in the clerk interface]" \ - "--update[update album/track caches]" \ - "--add[open clerk interface in different mode to add music to the current queue]" \ - "--random[play random tracks or album from the cli]" \ - "--queue[manage the current queue]" \ - "--playlist[save selection to playlist/load playlist from the clerk interface]" \ - "--rss[load poadcast]" \ - "--rate[rate albums or track]" \ - "--backup[backup ratings from mpd sticker database to json file]" \ - "--restore[restore ratings back to mpd sticker database]" \ - "--lastfm[last.fm operations]" - ret=0 - ;; - args) - case $words[2] in - --add) - if (( CURRENT == 3 )); then - _values "add parameters" \ - "track[browse music by track mode]" \ - "album[browse music by album mode]" \ - "latest[browse music by most recently added album mode]" - fi - ret=0 - ;; - --random) - if (( CURRENT == 3 )); then - _values "random parameters" \ - "track[some random tracks]" \ - "album[one random album]" - fi - ret=0 - ;; - --queue) - if (( CURRENT == 3 )); then - _values "queue parameters" \ - "show[show the current queue in the clerk interface]" \ - "suspend[freeze the current playlist and save it]" \ - "resume[load the last suspended playlist]" - fi - ret=0 - ;; - --playlist) - if (( CURRENT == 3 )); then - _values "playlist parameters" \ - "savealbum[save album to the 'clerk' playlist]" \ - "savetrack[save track to the 'clerk' playlist]" \ - "savelast[save latest album to the 'clerk' playlist]" \ - "load[choose a playlist to load]" - fi - ret=0 - ;; - --rate) - if (( CURRENT == 3 )); then - _values 'rate parameters' \ - 'track[rate the current track from the clerk interface]' \ - 'album[rate the current album from the clerk interface]' \ - 'instant[rate the current track {1-10} from the cli]' \ - 'load[play random rated (6 and over) tracks]' - else - case $words[3] in - instant) - _values 'rate' '1' '2' '3' '4' '5' '6' '7' '8' '9' '10' - ret=0 - ;; - esac - fi - ret=0 - ;; - --backup) - if (( CURRENT == 3 )); then - _values "backup parameters" \ - "album[backup album ratings]" \ - "track[backup track ratings]" - fi - ret=0 - ;; - --restore) - if (( CURRENT == 3 )); then - _values "restore parameters" \ - "album[restore album ratings]" \ - "track[restore track ratings]" - fi - ret=0 - ;; - --lastfm) - if (( CURRENT == 3 )); then - _values "lastfm parameters" \ - "toggle[toogle (on/off) last.fm]" \ - "check[print last.fm status]" \ - "love[love current playing track]" - fi - ret=0 - ;; - esac - ;; -esac - -return ret diff --git a/config.clerk b/config.clerk deleted file mode 100644 index 467878e..0000000 --- a/config.clerk +++ /dev/null @@ -1,84 +0,0 @@ -# rofi command. Make sure to have "$@" as last argument -_rofi () { - rofi -i -regex -lines 30 -width 1500 -no-levenshtein-sort "$@" -} - -# custom mpd host -mpd_host= -mpd_port= -mpd_password= - -# Number of Songs to be added for "Random Tracks" -value=20 - -# stop on suspend? -stop_after_suspend=no - -# exit after addition of tracks/albums -exit_after_add=no - -# use artist or albumartist for random tracks -random_artist=artist - -# scrobbler to use. possible values: mpdscribble, mpdas -scrobbler=mpdscribble - -# Fill these if scrobbler runs on a different host -# set to 0 if mpdscribble runs locally -ssh_lastfm=0 -ssh_host= - -# color of the help messages -# leave empty for autodetection -help_color="" - -# automatically save json file with track ratings -auto_track_rating_backup=true - -# custom keybindings -# global -albumlist="Alt+F1" -tracklist="Alt+F2" -queue="Alt+F3" -toggle="Alt+F6" -prev="Alt+F5" -next="Alt+F8" -stop="Alt+F7" -seek="Alt+f" -nextalbum="Alt+Shift+F8" -prevalbum="Alt+Shift+F5" - -# main menu -help="Alt+h" - -# Adding of songs/albums -add="Alt+1" -insert="Alt+2" -replace="Alt+3" -rate="Alt+r" -addplay="Alt+4" -insertplay="Alt+5" -savefav="Alt+s" - -# playlist menu -# also used: rate -delete="Alt+Delete" -crop="Alt+x" -clear="Alt+c" -movedown="Alt+Down" -moveup="Alt+Up" -goalbum="Alt+a" -gotrack="Alt+t" -playlist="Alt+p" - -# table customization -track_width="2" -title_width="40" -artist_width="40" -date_width="6" -# album is much longer in order to keep filename off screen -album_width="200" - -# custom widths for playlist -pl_title_width="60" -pl_artist_width="40" |