#!/usr/bin/env bb (ns toggle-headset (:require [clojure.java.shell :refer [sh]] [cheshire.core :as json])) (defn get-current-sink-name [] (-> (sh "pactl" "--format=json" "list" "sinks") :out (json/parse-string true) (->> (filter #(= (:state %) "RUNNING")) (first) :properties :device.name))) (defn get-card-current-profile [card] (-> (sh "pactl" "--format=json" "list" "cards") :out (json/parse-string true) (->> (filter #(= (:name %) card)) (first) :active_profile keyword ) )) (defn get-card-profiles [card] (-> (sh "pactl" "--format=json" "list" "cards") :out (json/parse-string true) (->> (filter #(= (:name %) card)) (first) :profiles (map #(assoc (second %) :name (first %))) (filter :available) (sort-by :priority >=) (partition-by (comp pos? :sources)) (map first) (take 2) (map :name) ))) (defn profile->emoji [profile] (if (re-find #"a2dp" (name profile)) "🎧" "🎤")) (defn toggle-card-profile [card] (let [current (get-card-current-profile card) profiles (get-card-profiles card)] [profiles current] (if-let [next-profile (some->> profiles (remove (partial = current)) first)] (do (sh "pactl" "set-card-profile" card (name next-profile)) (profile->emoji next-profile)) (prn "Error selecting next profile")))) (case (some->> *command-line-args* first) "get" (println (profile->emoji (get-card-current-profile (get-current-sink-name)))) "toggle" (println (toggle-card-profile (get-current-sink-name))))