FHEM Forum

FHEM - Anwendungen => Multimedia => Thema gestartet von: HolyMoly am 23 Januar 2014, 14:17:05

Titel: AppleTV
Beitrag von: HolyMoly am 23 Januar 2014, 14:17:05
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?
Titel: Antw:AppleTV
Beitrag von: betateilchen am 23 Januar 2014, 15:38:12
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.
Titel: Antw:AppleTV
Beitrag von: justme1968 am 23 Januar 2014, 16:23:22
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
Titel: Antw:AppleTV
Beitrag von: HolyMoly am 23 Januar 2014, 17:28:16
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...

Titel: Antw:AppleTV
Beitrag von: justme1968 am 25 Januar 2014, 21:17:04
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
Titel: Antw:AppleTV
Beitrag von: HolyMoly am 25 Januar 2014, 23:03:14
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);
}
Titel: Antw:AppleTV
Beitrag von: HolyMoly am 05 Februar 2014, 18:23:26
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 ;)


Titel: Antw:AppleTV
Beitrag von: Freddy am 07 November 2014, 23:43:36
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
Titel: Antw:AppleTV
Beitrag von: HolyMoly am 08 November 2014, 07:04:46
Hallo Freddy,

z.B. so
set AppleTv play http://www.mfiles.co.uk/mp3-downloads/edvard-grieg-peer-gynt1-morning-mood-flute-piano.mp3
Titel: Antw:AppleTV
Beitrag von: ChrisSeiler am 09 Juli 2016, 07:54:59
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
Titel: Antw:AppleTV
Beitrag von: HolyMoly am 09 Juli 2016, 08:21:23
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
Titel: Antw:AppleTV
Beitrag von: justme1968 am 09 Juli 2016, 09:59:53
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