Applescript um AirPlay zu aktivieren (Alfred 2 Workflow)

looper909

looper909

Aktives Mitglied
Thread Starter
Dabei seit
16.07.2011
Beiträge
218
Reaktionspunkte
13
Hallo,

ich habe vor ein kleinen Alfred 2 Workflow zu erstellen, mit welchem ich per Shortcut oder Keyword AirPlay (Ton) aktivieren bzw. wieder deaktivieren kann. Das ist wesentlich angenehmer und schneller als ständig den Punkt per Alt+Klick über die Menüleiste auszuwählen und/oder in die Systemeinstellungen zu gehen. Die Workflows beruhen auf Applescripts.

Beim stöbern bin ich bereits auf ein Script gestoßen, offensichtlich aktiviert dieses aber das Display Mirroring, welches mein MacBook eh nicht unterstützt. Da ich bisher erst wenig mit Applescripts zu tun hatte ist es für mich nun auch nicht einfach das Script schnell umzuschreiben. Ich bin aber soweit gekommen, dass zumindest die Ton-Einstellungen geöffnet werden (nicht besonders anspruchsvoll, geb' ich ja zu).
Nun macht mir aber der zweite Teil des Scripts Schwierigkeiten (click pop up button, click menu item...). Da die Ton-Einstellungen etwas anders gestaffelt sind als die Display-Einstellungen kann ich die Befehle nur schwer übertragen. Theoretisch muss dort ja auf den zweiten Reiter gewechselt und der entsprechende Menüpunkt (AirPlay-Empfänger bzw. Interne Lautsprecher) ausgewählt werden. Wie ist das zu realisieren oder geht es sogar noch einfacher? Und ist es möglich das Script im Hintergrund bzw. "unsichtbar" auszuführen?


Anbei das Script:
tell application "System Preferences"
set current pane to pane "com.apple.preference.sound"
activate
end tell

tell application "System Events"
tell process "System Preferences"
click pop up button 1 of window 1
click menu item 2 of menu 1 of pop up button 1 of window 1
end tell
end tell

tell application "System Preferences"
quit
end tell



-looper
 
-> Ein kleines nicht mit UI-Scripting arbeitendes Kommandozeilenprogramm dafür. :)

Und dann unter Anpassung der ersten drei Zeilen bspw. als Umschalter:

Code:
property audiodeviceOutputExecutable : "~/audiodevice output "
property internalAudioDevices : {"Internal Speakers", "Headphones"}
property airplayDevice : "Snow White"


set currentDevice to do shell script audiodeviceOutputExecutable
if currentDevice is airplayDevice then
	repeat with device in internalAudioDevices
		try
			do shell script audiodeviceOutputExecutable & quoted form of device
			return
		end try
	end repeat
else
	do shell script audiodeviceOutputExecutable & quoted form of airplayDevice
end if
(der "internal" shortcut für headphones/internal des Programms funktioniert bei mir irgendwie nicht)
 
Zuletzt bearbeitet:
Erst einmal Danke! Ich habe noch eine Möglichkeit gefunden, die ich auch per AppleScript zum laufen bringen konnte. Scheint alles zu funktionieren, und ähnlich wie deine Lösung zu sein. Allerdings habe ich zwei AirPlay Devices (eins hängt am AV-Receiver im Wohnzimmer, das andere beschallt Stereo Lautsprecher im Wintergarten). Leider ist es bei meiner Lösung nur möglich "AirPlay" oder "Build-in Output" zu wählen.

Bei deiner Lösung ist es ähnlich, dort wird nur ein AirPlay Device angezeigt. Bei meinem kurzen Test war es nur das aus dem Wintergarten. Gebe ich "Wohnzimmer" ein bekomme ich die Meldung "device not found!". Mir ist allerdings aufgefallen, dass ich über Alt-Klick auch nur ein Device angezeigt bekomme, entsprechend der letzten Verwendung. Sobald ich dort "Wohnzimmer" wähle zeigt auch dein Programm "Wohnzimmer" als mögliches Ausgabegerät an. Auf Internal kann ich leider auch nicht umschalten.
 
Hm...die Programme sind wohl nicht vollständig mit ML(und Airplay) kompatibel. Sonst musst Du's doch über UI-Scripting machen. Mein Vorschlag (läuft unauffällig im Hintergrund wenn die Systemeinstellungen nicht bereits geöffnet waren):

Code:
property internalAudioDevices : {"Internal Speakers", "Headphones"}
property airplayDevice : "Airport-HiFi"

set sysPrefsWasRunningBefore to application "System Preferences" is running
if sysPrefsWasRunningBefore then
	tell application "System Preferences" to set prevSysPrefPane to current pane
else
	tell application "System Preferences" to run
end if

tell application "System Preferences" to set current pane to pane "com.apple.preference.sound"

tell application "System Events" to tell application process "System Preferences"
	tell window 1 to tell tab group 1
		click radio button "Output"
		tell table 1 of scroll area 1
			set shouldPlayLocally to (value of (text field 2 of (rows whose selected is true)) as string is "AirPlay")
			if shouldPlayLocally then
				select item 1 of (rows whose value of text field 1 is (item 1 of internalAudioDevices) or value of text field 1 is (item 2 of internalAudioDevices))
			else
				select item 1 of (rows whose value of text field 1 is airplayDevice)
			end if
		end tell
	end tell
end tell


if sysPrefsWasRunningBefore then
	try
		tell application "System Preferences" to set current pane to prevSysPrefPane
	end try
else
	tell application "System Preferences" to quit
end if

ps: UI Browser ist hilfreich. Oder der mit Xcode gelieferte Accessibility Inspector.
 
Hab mich nun mit dem SwitchAudioSource Script arrangiert. Ich streame hauptsächlich eh an den AV-Receiver im Wohnzimmer, also ist die Möglichkeit zu wechseln nicht ganz so notwendig. Der Workflow enthält zwei simple Befehle: AirPlay ein- und ausschalten (zurück zu Internen Lautsprecher). Bis ich eine bessere Lösung finde komme ich damit wohl ganz gut zurecht. Das Ganze dient eh nur dazu mal schnell den Ton von Spotify oder YouTube auf die Boxen zu bringen.

Danke trotzdem für die Vorschläge!
 
Zurück
Oben Unten