NoPaste

Adventskalender 17. Dezember 2022

von smutbert
SNIPPET_DESC:
ein Skript das fzf verwendet
SNIPPET_CREATION_TIME:
17.12.2022 00:04:12
SNIPPET_PRUNE_TIME:
Unendlich

SNIPPET_TEXT:
  1. #!/bin/zsh
  2.  
  3. export LC_ALL=C.UTF-8
  4.  
  5. declare -a ItemName
  6. declare -a ItemType
  7. declare -a ItemCard
  8. declare -a ItemIndex
  9. declare -a ItemDisplayName
  10.  
  11. get_default_sink() {
  12.         pactl info | sed -En 's/Default Sink: (.*)/\1/p'
  13. }
  14.  
  15. get_default_source() {
  16.         pactl info | sed -En 's/Default Source: (.*)/\1/p'
  17. }
  18.  
  19. new_sink() {
  20.         (
  21.                 get_default_sink
  22.                 comm -1 -3 <(echo ${1} | sort -u) <(pactl list sinks short | sort -u) | awk '{ print $2; exit }'
  23.         ) | tail -n1
  24. }
  25.  
  26. new_source() {
  27.         (
  28.                 get_default_source
  29.                 comm -1 -3 <(echo ${1} | sort -u) <(pactl list sources short | sort -u) | awk '{ print $2; exit }'
  30.         ) | tail -n1
  31. }
  32.  
  33. move_all_streams() {
  34.         for stream in $(pactl list sink-inputs | awk '$1 == "index:" {print $2}') ; do
  35.                 pactl move-sink-input ${stream} ${1} >/dev/null 2>&1
  36.         done
  37. }
  38.  
  39. move_all_recordings() {
  40.         for stream in $(pactl list source-outputs | awk '$1 == "index:" {print $2}') ; do
  41.                 pactl move-source-output ${stream} ${1} >/dev/null 2>&1
  42.         done
  43. }
  44.  
  45. SinkList=$(pactl list sinks short)
  46. SourceList=$(pactl list sources short)
  47.  
  48. i=1
  49. for Sink in $(echo ${SinkList} | awk '{ print $2 }'); do
  50.         ItemIndex[${i}]=${i}
  51.         ItemType[${i}]="sink"
  52.         ItemName[${i}]=${Sink}
  53.         if [[ ${Sink} == $(get_default_sink) ]]; then
  54.                 ItemDisplayName[${i}]="> sink: ${Sink}"
  55.         else
  56.                 ItemDisplayName[${i}]="  sink: ${Sink}"
  57.         fi
  58.         i=$((i+1))
  59. done
  60. for Source in $(echo ${SourceList} | awk '{ print $2 }'); do
  61.         ItemIndex[${i}]=${i}
  62.         ItemType[${i}]="source"
  63.         ItemName[${i}]=${Source}
  64.         if [[ ${Source} == $(get_default_source) ]]; then
  65.                 ItemDisplayName[${i}]="> source: ${Source}"
  66.         else
  67.                 ItemDisplayName[${i}]="  source: ${Source}"
  68.         fi
  69.         i=$((i+1))
  70. done
  71.  
  72.  
  73. Available=", available: yes)"
  74. for Card in ${(ps:\n\n:)"$(pactl list cards 2> /dev/null)"}; do
  75.         ActiveProfile=${Card##*Active Profile: }
  76.         ActiveProfile=${ActiveProfile%%$'\n\t'Ports*}
  77.         RawProfiles=${Card##*Profiles:}
  78.         RawProfiles=${RawProfiles%%Active Profile:*}
  79.         for Profile in ${(f)RawProfiles}; do
  80.                 ProfileName=${Profile%%: *}
  81.                 ProfileName=${ProfileName//[[:blank:]]/}
  82.                 ProfileDescription=${Profile#*: }
  83.  
  84.                 [[ ${ProfileDescription} == *${Available}* ]] || continue
  85.                 [[ ${ProfileName} == ${ActiveProfile} ]] && continue
  86.  
  87.                 ItemIndex[${i}]=${i}
  88.                 ItemType[${i}]="profile"
  89.                 ItemName[${i}]=${ProfileName}
  90.                 ItemCard[${i}]=${Card%%$'\n\t'Driver: *}
  91.                 ItemCard[${i}]=${ItemCard[${i}]##Card \#*$'\n\t'Name: }
  92.                 DisplayCard=${ItemCard[${i}]%%_*}.${ItemCard[${i}]#*.}
  93.                 DisplayCard=${DisplayCard%%-*}.${ItemCard[${i}]##*.}
  94.                 ItemDisplayName[${i}]="${DisplayCard} → ${ItemName[${i}]}"
  95.                 i=$((i+1))
  96.         done
  97. done
  98.  
  99. Selection=$(
  100.         for i in ${ItemIndex}; do
  101.                 echo -e "${ItemIndex[${i}]} \034 ${ItemDisplayName[${i}]}"
  102.         done | fzf -d ' \034 ' --with-nth=2 --nth=2
  103. )
  104.  
  105. test -z "${Selection}" && exit 0
  106. Selection=${Selection%% $'\034' *}
  107.  
  108. case "${ItemType[${Selection}]}" in
  109.         "sink")
  110.                 pactl set-default-sink ${ItemName[${Selection}]}
  111.                 move_all_streams ${ItemName[${Selection}]}
  112.         ;;
  113.         "source")
  114.                 pactl set-default-source ${ItemName[${Selection}]}
  115.                 move_all_recordings ${ItemName[${Selection}]}
  116.         ;;
  117.         "profile")
  118.                 pactl set-card-profile ${ItemCard[${Selection}]} ${ItemName[${Selection}]}
  119.  
  120.                 NewSink=$(new_sink ${SinkList})
  121.                 NewSource=$(new_source ${SourceList})
  122.  
  123.                 pactl set-default-source ${NewSource}
  124.                 pactl set-default-sink ${NewSink}
  125.                 move_all_recordings ${NewSink}
  126.                 move_all_streams ${NewSink}
  127.         ;;
  128. esac

Quellcode

Hier kannst du den Code kopieren und ihn in deinen bevorzugten Editor einfügen. PASTEBIN_DOWNLOAD_SNIPPET_EXPLAIN