diff --git a/sonos.sh b/sonos.sh index a07d3f7..22b329e 100755 --- a/sonos.sh +++ b/sonos.sh @@ -1,18 +1,75 @@ #!/bin/bash -# list: local or discovery -# --use-local-speaker-list, -l -# Use the local speaker list instead of SoCo discovery -# --refresh-local-speaker-list, -r -# Refresh the local speaker list -list="local" -if [ "$list" = "discovery" ]; then - loc="" -else - loc=" -l" -fi +#set -e +set -u +#set -o pipefail + +#\033[background;style;color] +# background: 40-49,100-107 +# color: 30-39,90-97 +# style: 1 (bold) 2 (light) 4 (underline) 5 (blink) 7 (reverse) 8 (hidden) + +list="local" +if [ "$list" = "discovery" ]; then loc=""; +else loc=" -l"; fi +echo "$loc" +#sleep 3 + + +underline="\033[4m" +bgd="\033[1;4;31m" +red="\033[1;31m" +bold="\033[1m" +reset="\033[0m" + + +# Main Menu + +main() { + + clear + set device + device="$1" + + while : + do + clear + + echo -e "" + echo -e "\033[1m 🔈 SoCo-Cli GUI\033[0m" + echo -e "" + + echo -e " " + echo -e "---------------------------------" + echo -e " Main Menu " + echo -e "---------------------------------" + echo -e " 1) ${bgd}A${reset}bout " + echo -e " 2) ${bgd}H${reset}elp " + echo -e " 3) ➔ ${bgd}C${reset}hambre " + echo -e " 4) ➔ ${bgd}S${reset}alon " + echo -e " 5) ${bgd}Q${reset}uit " + echo -e "=================================" + echo -e "Enter your menu choice [1-5]: \c " + + read main_menu + + case "$main_menu" in + + 1|a|A) about + read -p "" + ;; + 2|h|H) help + read -p "" + ;; + 3|c|C) soco "Chambre";; + 4|s|S) soco "Salon";; + 5|q|Q) exit 0;; + *) echo -e "\n${red}Oops!!! Please Select Correct Choice${reset}"; + echo -e "Press ${bold}ENTER${reset} To Continue..." ; read ;; + esac + done + } -clear about() { clear @@ -34,6 +91,7 @@ about() { echo "" echo "" } + help() { echo "" @@ -42,6 +100,7 @@ help() { echo "" } + inform() { device="$1" info=$(sonos $loc $device info) @@ -67,327 +126,435 @@ inform() { printf "| %-20s | %-20s |\n" "Hardware version" "$hardware_version" printf "| %-20s | %-20s |\n" "Software version" "$software_version" echo "" - echo "< Press Enter>" } -soco_infos() { + +# Soco device Menu + +soco() { clear + #set device + playing="" device="$1" - while true - do - clear - echo "" - echo -e "\033[1m 🔊 Sonos infos $device \033[0m" - echo "" - PS3="Select an option: " - options=( - "(A)larms" - "(G)roups" - "(I)nfo" - "(S)hares" - "S(y)sinfo" - "(R)eturn" - ) - select opt2 in "${options[@]}" - do - case "$REPLY" in - 1|a|A) - echo -e "\n\033[1m Alarms... \033[0m" - a=$(sonos $device alarms) - echo -e "\n $a \n" - read -p "< Press Enter>" - break - ;; - 2|g|G) - echo -e "\n\033[1m Groups... \033[0m" - g=$(sonos $device groups) - echo -e "\n $g \n" - read -p "< Press Enter>" - break - ;; - 3|i|I) - echo -e "\n\033[1m Info... \033[0m" - #sonos $device info - inform $device - read -p "" - break - ;; - 4|s|S) - echo -e "\n\033[1m Shares... \033[0m" - s=$(sonos $device shares) - echo -e "\n $s \n" - read -p "< Press Enter>" - break - ;; - 5|y|Y) - echo -e "\n\033[1m Sysinfo... \033[0m" - y=$(sonos $device sysinfo) - echo -e "\n $y \n" - read -p "< Press Enter>" - break - ;; - 6|r|R) - exec "$0" - ;; - *) echo -e "\n\033[1;31m invalid option \033[0m";; - esac - done - done + while : + do + clear + echo -e "" + echo -e "\033[1m 🔊 Sonos $device \033[0m" + echo -e "" + echo -e " " + echo -e "------------------------|-------------------------|--------------------" + echo -e " Sonos $device Menu : $playing " + echo -e "------------------------|-------------------------|--------------------" + echo -e " 1) France In${bgd}f${reset}o " " | " "11) volume ${bgd}11${reset} " " | " "21) ➔ ${bgd}I${reset}nfos " + echo -e " 2) France Int${bgd}e${reset}r " " | " "12) ${bgd}m${reset}ute ON " " | " "22) ➔ ${bgd}L${reset}ists " + echo -e " 3) ${bgd}K${reset}6 FM " " | " "13) volume ${bgd}13${reset} " " | " "23) Play al${bgd}b${reset}ums " + echo -e " 4) Rires et ${bgd}C${reset}hansons " " | " "14) m${bgd}u${reset}te OFF " " | " "24) Play artists (${bgd}x${reset}) " + echo -e " 5) ${bgd}R${reset}TL " " | " "15) volume ${bgd}15${reset} " " | " "25) Play tracks (${bgd}y${reset}) " + echo -e " 6) ${bgd}D${reset}eezer Flow " " | " "16) ${bgd}s${reset}tart $device " " | " "26) " + echo -e " 7) " " | " "17) s${bgd}t${reset}op $device " " | " "27) " + echo -e " 8) " " | " "18) ${bgd}p${reset}rev on $device " " | " "28) " + echo -e " 9) " " | " "19) ${bgd}n${reset}ext on $device " " | " "29) ${bgd}H${reset}elp " + echo -e "10) " " | " "20) Sha${bgd}z${reset}aaaam " " | " "30) ➔ ${bgd}A${reset}ccueil " + echo -e "========================================================================" + echo -e "Enter your menu choice [1-30]: \c " + read soco_menu + + case "$soco_menu" in + + 1|f|F) option_1;; + 2|e|E) option_2;; + 3|k|K) option_3;; + 4|c|C) option_4;; + 5|r|R) option_5;; + 6|d|D) option_6;; + 11) option_11;; + 12|m|M) option_12;; + 13) option_13;; + 14|u|U) option_14;; + 15) option_15;; + 16|s|S) option_16;; + 17|t|T) option_17;; + 18|p|P) option_18;; + 19|n|N) option_19;; + 20|z|Z) option_20;; + 21|i|I) soco_infos $device;; + 22|l|L) soco_lists $device;; + 23|b|B) play_album_from_library;; + 24|x|X) play_artist_from_library;; + 25|y|Y) play_track_from_library;; + 29|h|H) help;; + 30|a|A) exec "$0";; + *) echo -e "\n${red}Oops!!! Please Select Correct Choice${reset}"; + echo -e "Press ${bold}ENTER${reset} To Continue..." ; read ;; + esac + done } + +# Playing France Info +option_1() { + #echo "$loc" + playing="Playing France Info..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'franceinfo' && sleep 2 + } + +# Playing France Inter +option_2() { + playing="Playing France Inter..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'france inter' && sleep 2 + } + +# Playing K6 FM +option_3() { + playing="Playing K6 FM..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'K6 FM' && sleep 2 + } + +# Playing Rires et Chansons +option_4() { + playing="Playing Rires et Chansons..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'Rire et Chansons' && sleep 2 + } + +# Playing RTL +option_5() { + playing="Playing RTL..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'RTL' && sleep 2 + } + +# Playing Deezer Flow +option_6() { + playing="Playing Deezer Flow..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device play_fav 'Flow' + } + +# Set volume to level 11 +option_11() { + #playing="Playing Deezer Flow..." + echo -e "\n\033[1m Set volume to level 11... \033[0m" + sonos $loc $device volume 11 && sleep 2 + } + +# Mute ON +option_12() { + playing="Mute ON..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device mute on && sleep 2 + } + +# Set volume to level 13 +option_13() { + #playing="Start $device..." + echo -e "\n\033[1m Set volume to level 13... \033[0m" + sonos $loc $device volume 13 && sleep 2 + } + +# Mute OFF +option_14() { + #playing="Playing Deezer Flow..." <= Shazaaam + echo -e "\n\033[1m Mute OFF... \033[0m" + sonos $loc $device mute off && sleep 2 + } + +# Set volume to level 15 +option_15() { + #playing="Stop $device..." + echo -e "\n\033[1m Set volume to level 15... \033[0m" + sonos $loc $device volume 15 && sleep 2 + } + +# Start $device +option_16() { + playing="Start $device..." # <= Shazaaam + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device start && sleep 2 + } + +# Stop $device +option_17() { + playing="Stop $device..." + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device stop && sleep 2 + } + +# Previous tracks +option_18() { + #playing="Start $device..." # <= Shazaaam + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device previous && sleep 2 + } + +# Next tracks +option_19() { + #playing="Stop $device..." # <= Shazaaam + echo -e "\n\033[1m $playing \033[0m" + sonos $loc $device next && sleep 2 + } + +# Shazaaaam +option_20() { + echo -e "\n\033[1m Shazaaaam... \033[0m" + shazam + } + +shazam() { + sz=$(sonos $loc $device track) + + if [[ "$sz" =~ "Artist" ]]; then artist=$(echo "$sz" | grep "Artist" | awk -F"[=:]" '{print $2}'); + else artist=""; fi + + if [[ "$sz" =~ "Title" ]]; then title=$(echo "$sz" | grep "Title" | awk -F"[=:]" '{print $2}'); + else title=""; fi + + if [[ "$sz" =~ "Album" ]]; then album=$(echo "$sz" | grep "Album" | awk -F"[=:]" '{print $2}'); + else album=""; fi + + result=$( grep -i "uRi" <<< $sz) + if [ -n "$result" ]; then + uri=$(echo ${sz} | grep "URI" | grep -Eo '(https?|ftp|file)://[-A-Za-z0-9\+&@#/%?=~_|!:,.;]*[-A-Za-z0-9\+&@#/%=~_|]'); + + if [[ "$uri" =~ "?" ]]; then + radio=$(echo "$uri" | awk -F"?" '{print $1}') + else + radio="$uri" + fi + else radio=""; fi + + if [ -n "$radio" ]; then + shazam="\033[1mOn air\033[0m: \033[3m$radio\033[0m" + else + shazam="\033[1mOn air\033[0m: \033[1m$title\033[0m \033[3mfrom\033[0m $album \033[3mof\033[0m $artist" + fi + + echo -e "\n $shazam \n" + sleep 2.5 + #read -p "< Press Enter>" + } + + +# Search artist in library -> add album to queue -> play it +play_artist_from_library() { + read -p "Search artist in library: " search + sonos $loc $device search_artists "$search" + + read -p "Album to play: " number + sonos $loc $device queue_search_result_number $number first : $device play_from_queue + } + +# Search album in library -> add to queue -> play it +play_album_from_library() { + read -p "Search album in library: " search + sonos $loc $device search_albums "$search" + + read -p "Album to play: " number + sonos $loc $device queue_search_result_number $number first : $device play_from_queue + } + +# Search track in library -> add to queue -> play it +play_track_from_library() { + read -p "Search track in library: " search + sonos $loc $device search_tracks "$search" + + read -p "Track to play: " number + sonos $loc $device queue_search_result_number $number first : $device play_from_queue + } + +# Help +help() { + echo -e "\n\033[1m Help... \033[0m\n" + echo -e "Play albums:" + echo -e "Play artists:" + echo -e "Play tracks:" + + echo -e "\n" + read -p "< Press Enter>" + } + +# Soco device Lists Menu + soco_lists() { clear device="$1" - while true - do - clear - echo "" + while : + do + clear + echo -e "" echo -e "\033[1m 🔊 Sonos lists $device \033[0m" - echo "" - PS3="Select an option: " - options=( - "Favourite radio (s)tations" - "(F)avourites" - "(Q)ueue" - "List (a)rtists" - "List al(b)ums" - "(R)eturn" - ) - select opt2 in "${options[@]}" - do - case "$REPLY" in - 1|s|S) - echo -e "\n\033[1m Favourite radio stations... \033[0m" - s=$(sonos $device favourite_radio_stations) - echo -e "\n $s \n" - read -p "< Press Enter>" - break - ;; - 2|f|F) - echo -e "\n\033[1m Favourites... \033[0m" - f=$(sonos $device list_favs) - echo -e "\n $f \n" - read -p "< Press Enter>" - break - ;; - 3|q|Q) - echo -e "\n\033[1m Queue... \033[0m" - q=$(sonos $device list_queue) - echo -e "\n $q \n" - read -p "< Press Enter>" - break - ;; - 4|a|A) - echo -e "\n\033[1m List artists... \033[0m" - a=$(sonos $device list_artists | more) - echo -e "\n $a \n" - read -p "< Press Enter>" - break - ;; - 5|b|B) - echo -e "\n\033[1m List albums... \033[0m" - b=$(sonos $device list_albums | more) - echo -e "\n $b \n" - read -p "< Press Enter>" - break - ;; - 6|r|R) - exec "$0" - ;; - *) echo -e "\n\033[1;31m invalid option \033[0m";; - esac - done - done + echo -e "" + echo -e " " + echo -e "--------------------------------" + echo -e " Sonos $device lists Menu " + echo -e "--------------------------------" + echo -e " 1) Favourite radio ${bgd}s${reset}tations " " | " + echo -e " 2) ${bgd}F${reset}avourites " " | " + echo -e " 3) ${bgd}Q${reset}ueue " " | " + echo -e " 4) List ${bgd}a${reset}rtists " " | " + echo -e " 5) List al${bgd}b${reset}ums " " | " + echo -e " 6) " " | " + echo -e " 7) " " | " + echo -e " 8) " " | " + echo -e " 9) ${bgd}C${reset}lear queue " " | " + echo -e "10) ${bgd}R${reset}eturn " " | " + echo -e "================================" + echo -e "Enter your menu choice [1-10]: \c " + read lists + + case "$lists" in + + 1|s|S) list_1;; + 2|f|F) list_2;; + 3|q|Q) list_3;; + 4|a|A) list_4;; + 5|b|B) list_5;; + 9|c|C) list_9;; + 10|r|R) exec "$0";; + *) echo -e "\n${red}Oops!!! Please Select Correct Choice${reset}"; + echo -e "Press ${bold}ENTER${reset} To Continue..." ; read ;; + esac + done } -soco() { + +# Favourite radio stations +list_1() { + echo -e "\n\033[1m Favourite radio stations... \033[0m" + s=$(sonos $loc $device favourite_radio_stations) + echo -e "\n $s \n" + read -p "< Press Enter>" + } + +# Favourites +list_2() { + echo -e "\n\033[1m Favourites... \033[0m" + f=$(sonos $loc $device list_favs) + echo -e "\n $f \n" + read -p "< Press Enter>" + } + +# Queue +list_3() { + echo -e "\n\033[1m Queue... \033[0m" + q=$(sonos $loc $device list_queue) + echo -e "\n $q \n" + read -p "< Press Enter>" + } + +# List Artists +list_4() { + echo -e "\n\033[1m List artists... \033[0m" + a=$(sonos $loc $device list_artists | more) + echo -e "\n $a \n" + read -p "< Press Enter>" + } + +# Lists Albums +list_5() { + echo -e "\n\033[1m List albums... \033[0m" + b=$(sonos $loc $device list_albums | more) + echo -e "\n $b \n" + read -p "< Press Enter>" + } + +# Clear queue +list_9() { + echo -e "\n\033[1m Clear queue... \033[0m" + sonos $loc $device clear_queue + q=$(sonos $loc $device queue_length) + if [ $q -eq 0 ]; then echo "Queue is empty"; else echo "Queue is not empty"; fi + sleep 1.5 + } + + +# Soco device Infos Menu + +soco_infos() { clear device="$1" - while true - do - clear - echo "" - echo -e "\033[1m 🔊 Sonos $device \033[0m" - echo "" - PS3="Select an option: " - options=( - "France In(f)o" - "France In(t)er" - "(K)6 FM" - "Rires et (C)hansons" - "(R)TL" - "(D)eezer Flow" - "(P)laylist list_favs" - "-(s)tart $device" - "-s(t)op $device" - "-(i)nfos on $device" - "-volume (11)" - "-(m)ute ON" - "-volume (13)" - "-m(u)te OFF" - "-volume (15)" - "-status light O(N)" - "-status light (O)FF" - "Sha(z)aaaam" - "➔ (I)nfos" - "➔ (L)ists" - "Menu Princip(a)l" - ) - select opt2 in "${options[@]}" - do - case "$REPLY" in - 1|f|F) - echo -e "\n\033[1m Playing France Info... \033[0m" - sonos $loc $device play_fav 'franceinfo' && sleep 2 - break - ;; - 2|t|T) - echo -e "\n\033[1m Playing France Inter... \033[0m" - sonos $loc $device play_fav 'france inter' && sleep 2 - break - ;; - 3|k|K) - echo -e "\n\033[1m Playing K6 FM... \033[0m" - sonos $loc $device play_fav 'K6 FM' && sleep 2 - break - ;; - 4|c|C) - echo -e "\n\033[1m Playing Rires et Chansons... \033[0m" - sonos $loc $device play_fav 'Rire et Chansons' && sleep 2 - break - ;; - 5|r|R) - echo -e "\n\033[1m Playing RTL... \033[0m" - sonos $loc $device play_fav 'RTL' && sleep 2 - break - ;; - 6|d|D) - echo -e "\n\033[1m Playing Deezer Flow... \033[0m" - sonos $loc $device play_fav 'Flow' - break - ;; - 7|p|P) - echo -e "\n\033[1m Display playlist list_favs... \033[0m" - sonos $loc $device list_favs - read -p "" - break - ;; - 8|s|S) - echo -e "\n\033[1m Start $device... \033[0m" - sonos $loc $device start && sleep 2 - break - ;; - 9|t|T) - echo -e "\n\033[1m Stop $device... \033[0m" - sonos $loc $device stop && sleep 2 - break - ;; - 10) - echo -e "\n\033[1m Infos on $device... \033[0m" - inform $device - read -p "" - break - ;; - 11) - echo -e "\n\033[1m Set volume to level 11... \033[0m" - sonos $loc $device volume 11 && sleep 2 - break - ;; - 12|m|M) - echo -e "\n\033[1m Mute ON... \033[0m" - sonos $loc $device mute on && sleep 2 - break - ;; - 13) - echo -e "\n\033[1m Set volume to level 13... \033[0m" - sonos $loc $device volume 13 && sleep 2 - break - ;; - 14|u|U) - echo -e "\n\033[1m Mute OFF... \033[0m" - sonos $loc $device mute off && sleep 2 - break - ;; - 15) - echo -e "\n\033[1m Set volume to level 15... \033[0m" - sonos $loc $device volume 15 && sleep 2 - break - ;; - 16|n|N) - echo -e "\n\033[1m Status light ON... \033[0m" - sonos $loc $device status_light on && sleep 2 - break - ;; - 17|o|O) - echo -e "\n\033[1m Status light OFF... \033[0m" - sonos $loc $device status_light off && sleep 2 - break - ;; - 18|z|Z) - echo -e "\n\033[1m Shazaaaam... \033[0m" - sonos $loc $device track && sleep 5 - break - ;; - 18|i|I) - echo -e "\n\033[1m Infos... \033[0m" - soco_infos $device - #break - ;; - 19|l|L) - echo -e "\n\033[1m Lists... \033[0m" - soco_lists $device - #break - ;; - 20|a|A) - exec "$0" - ;; - *) echo -e "\n\033[1;31m invalid option \033[0m";; - esac - done - done + while : + do + clear + echo -e "" + echo -e "\033[1m 🔊 Sonos $device infos \033[0m" + echo -e "" + echo -e " " + echo -e "--------------------------------" + echo -e " Sonos $device infos Menu " + echo -e "--------------------------------" + echo -e " 1) ${bgd}A${reset}larms " " | " + echo -e " 2) ${bgd}G${reset}roups " " | " + echo -e " 3) ${bgd}I${reset}nfo " " | " + echo -e " 4) ${bgd}S${reset}hares " " | " + echo -e " 5) S${bgd}y${reset}sinfo " " | " + echo -e " 6) " " | " + echo -e " 7) " " | " + echo -e " 8) " " | " + echo -e " 9) " " | " + echo -e "10) ${bgd}R${reset}eturn " " | " + echo -e "================================" + echo -e "Enter your menu choice [1-10]: \c " + read infos + + case "$infos" in + + 1|a|A) info_1;; + 2|g|G) info_2;; + 3|i|I) info_3;; + 4|s|S) info_4;; + 5|y|Y) info_5;; + 10|r|R) exec "$0";; + *) echo -e "\n${red}Oops!!! Please Select Correct Choice${reset}"; + echo -e "Press ${bold}ENTER${reset} To Continue..." ; read ;; + esac + done } +# Alarms +info_1() { + echo -e "\n\033[1m Alarms... \033[0m" + a=$(sonos $loc $device alarms) + echo -e "\n $a \n" + read -p "< Press Enter>" + } -while true -do -clear +# Groups +info_2() { + echo -e "\n\033[1m Groups... \033[0m" + g=$(sonos $loc $device groups) + echo -e "\n $g \n" + read -p "< Press Enter>" + } -echo -e "" -echo -e "\033[1m 🔈 SoCo-Cli GUI\033[0m" -echo -e "" +# Infos +info_3() { + inform $device + read -p "< Press Enter>" + } -PS3='Select an option: ' -options=("(A)bout" "(H)elp" "➔ (C)hambre" "➔ (S)alon" "(Q)uit") - -select opt in "${options[@]}" -do - case "$REPLY" in - 1|a|A) - about - read -p "" - break - ;; - 2|h|H) - help - read -p "" - break - ;; - 3|c|C) - soco "Chambre" - ;; - 4|s|S) - soco "Salon" - ;; - 5|q|Q) - exit - ;; - *) echo "invalid option" - ;; - esac - done -done +# Shares +info_4() { + echo -e "\n\033[1m Shares... \033[0m" + s=$(sonos $loc $device shares) + echo -e "\n $s \n" + read -p "< Press Enter>" + } +# Sysinfo +info_5() { + echo -e "\n\033[1m Sysinfo... \033[0m" + y=$(sonos $loc $device sysinfo) + echo -e "\n $y \n" + read -p "< Press Enter>" + } + +main