Hallo zusammen,
Habe ein kleines Modul entwickelt welches mp3/4 auf dem AppleTV abspielen kann.
sub
AppleTV_Play($$)
{
my ($hash, $uri) = @_;
my $sock = Net::HTTP->new(
Host => $hash->{Host},
PeerPort => $hash->{Port},
KeepAlive => 1) or die("Error: Could not connect to Apple TV on $hash->{Host}");
Log 3, $hash->{NAME}.": Play: " . $uri." at ".$hash->{Host}.":".$hash->{Port};
$sock->write_request(POST => '/play',
'User-Agent' => 'iTunes/11.0.2',
"Content-Location: $uri\nStart-Position: 0.000000\n");
my ($status, $message, %headers) = $sock->read_response_headers;
if ($status != 200){
return "Error: Apple TV responded: $status, $message";
}
sleep(100);
return "Success: Apple TV responded: $status, $message";
}
Leider bricht die Wiedergabe ab sobald ich aus dem sub returne, ich nehme an weil dann der socket nicht mehr da ist.
Die momentane Notlösung per sleep blockiert natürlich ganz perl, hat jemand eine Idee wie man das besser machen könnte?
Leider ist Dein Coding nicht vollständig.
Das Socket an sich existiert aber nur innerhalb der sub() deshalb kann das nicht dauerhaft weiterlaufen. Entweder das Socket außerhalb erzeugen und an die sub übergeben oder vielleicht einen ganz anderen Weg der Kommunikation wählen. Wenn schon http, warum dann nicht die fhem-eigenen HttpUtils verwenden, dort gibt es auch nonblocking-Methoden. Vielleicht kommst Du ja damit weiter.
vielleicht magst du ja mal den ganzen code posten und das ganze mit dem itunes modul integrieren. das kann schon einiges andere an itunes und apple tv steuerung und eine erweiterung zum abspielen von lokalen mp3 files wäre für die zsammenarbeit mit dem text2speech modul klasse.
gruss
andre
Wäre mir auch das liebste das ins iTunes modul zu integrieren,
ich bin allerdings Perl-Neuling und von der Komplexität des iTunesmoduls etwas überwältigt 8)
Ausserdem sind wahrscheinlich noch haarsträubende Fehler in dem Modul versteckt ;)
Anbei mal das Modul...
ich hab grad ein bischen mit deinem modul gespielt... und ein paar sehr nette dinge herausgefunden :)
mein altes apple tv kann das zwar leider nicht aber das was darunter liegt ist das normale airplay protokoll. und mein plex player kann das zum beispiel. und damit geht es wunderbar. zumindest wenn ich einen stream eines 'richtigen' web servers oder z.b. eine internet radio station angebe. es bricht mit plex auch nichts ab.
ich vermute ein apple tv ist da etwas weniger großzügig und möchte das das socket offen bleibt. das ist aber eigentlich kein problem. ich schau mal wie man das am besten einbaut.
ich wollte eigentlich den fhem internen web server dafür missbrauchen um z.b. direkt ein text2speech mp3 file ausgeben. aber der kommt mit grossen mp3 files nicht klar. das wäre die einfache lösung gewesen.
das protokoll gibt neben audio auch noch video sowie status requests, die wiedergabe von fotos und noch einiges mehr her und man könnte damit vielleicht sogar direkt an airport express senden.
ich weiss leider gerade nicht wann ich dazu komme... aber man könnte damit einige nette dinge machen.
gruss
andre
Hi Andre,
Hier noch ein paar gute Links zum Thema:
Control appletv via perl example http://xyrion.org/appletv/ (http://xyrion.org/appletv/)
Airplay Protocol http://nto.github.io/AirPlay.html (http://nto.github.io/AirPlay.html)
Old Shairport written in perl https://github.com/abrasive/shairport/blob/0.x/shairport.pl (https://github.com/abrasive/shairport/blob/0.x/shairport.pl)
text2speech kannst du evtl so lösen (ungetestet):
sub
AppleTV_Say($$)
{
my ($hash, $text) = @_;
my $uri=urlEncode("http://translate.google.com/translate_tts?tl=de&q=\"$text\"");
#Log 3, $hash->{NAME}.": Say: " . $text." at ".$hash->{Host}.":".$hash->{Port};
AppleTV_Play($hash,$uri);
}
Neue Version, non-blocking, text2speech geht innerhalb der google translate grenze.
Positionsabfrage wo der playback gerade ist, sehr unzuverlässig aber ich werkel dran... daher läuft er momentan immer in einen 60s wiedergabe timeout, kann man aber einfach höher stellen dann reichts auch für längere weck mp3s ;)
Hallo,
kannst du vieleicht eine Beispiel zum abspielen von mp3 oder RadioStream zeigen.
Ich habe FHEM auf ein Synology NAS am laufen und würde gerne mein Programme als Wecker nutzen
Hallo Freddy,
z.B. so
set AppleTv play http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood-flute-piano.mp3
Hallo zusammen
Ich weiss, der Thread liegt schon seit einiger Zeit brach. Doch ich möchte das Thema gerne aufgreifen. Hat sich in Sachen AirPlay inzwischen etwas getan? Ich habe mir den Code für den AppleTV angeschaut und etwas damit experimentiert. Auf dem AppleTV läuft das Modul ganz ordentlich, wenn ich den Code aber für den Airport Express anpassen möchte (Port 3689) stürzt mein FHEM Server ab. Hat bisher jemand Glück etwas Musik aus dem Airport Express zu kitzeln?
Gruss Christian
Hi Christian,
für Airport Express musst du glaub ich verschlüsselt per RAOP oder so senden.
Lass dich mal davon inspirieren https://github.com/DSTMK/shairport_plugin/blob/master/Plugin.pm
wenn du ein Apple TV hast sendest du nicht direkt an den Airport sondern sagst dem Apple TV das es den Airport zur Ausgabe verwenden soll. das ist (war) eingebaut und sollte ohne änderung funktionieren.
wenn du direkt etwas an den Airport senden willst funktioniert das komplett anders. auch mal im forum. irgendwo gibt es einen eigen thread dazu.
gruss
andre